Тег NavigationLink и выделение не работают должным образом

Возможно, мне что-то не хватает, но я не могу заставить NavigationLink работать внутри списка.
Я использую NavigationLink (пункт назначения, тег, выбор), и я хотел бы перейти к корневому представлению одним нажатием кнопки, как вы можете видеть в этом примере проекта:

import SwiftUI

struct ContentView: View {
    @State var selectedView: Int? = nil
    var colors: [String] = ["blue", "yellow", "green", "red", "black"]
    
    var body: some View {
        NavigationView {
            List{
                ForEach(colors.indices) { index in
                    NavigationLink(
                        destination: ColorDetail(selectedView: self.$selectedView, color: colors[index]),
                        tag: index,
                        selection: self.$selectedView,
                        label: {
                            Text(colors[index])
                        })
                }
            }
        }
    }
}

struct ColorDetail: View {
    
    @Binding var selectedView: Int?
    var color: String
    
    var body: some View {
        VStack {
            Text(color)
            Text("SelectedView: \(selectedView ?? 99)")
            Button("set SelectedView to nil and go back") {
                self.selectedView = nil
            }
        }
    }
}

Почему, если я установлю selectedView в ноль, ничего не произойдет? Как я могу перейти к корневому представлению (ContentVIew) из ColorDetail одним нажатием кнопки?

Просто скопируйте этот код и попробуйте, он будет построен.


person DanielZanchi    schedule 09.12.2020    source источник
comment
Еще один дефект 14,2. Прекрасно работает с 14.1.   -  person Asperi    schedule 09.12.2020
comment
Действительно? Я надеялся, что делаю что-то не так ...   -  person DanielZanchi    schedule 09.12.2020


Ответы (1)


Как говорит Аспери, это похоже на ошибку в 14.2, поскольку она действительно должна работать, установив ее на ноль. Однако, если вам нужен обходной путь, который должен работать во всех версиях, попробуйте использовать presentationMode

struct ColorDetail: View {
    
    @Binding var selectedView: Int?
    var color: String
    @Environment(\.presentationMode) var presentationMode

    var body: some View {
        VStack {
            Text(color)
            Text("SelectedView: \(selectedView ?? 99)")
            Button("set SelectedView to nil and go back") {
                self.selectedView = nil
                self.presentationMode.wrappedValue.dismiss()
            }
        }
    }
}
person davidev    schedule 09.12.2020