SwiftUI динамически выдвигает NavigationLink со списком ссылок - PullRequest
1 голос
/ 24 октября 2019

Я хочу открыть NavigationLink из кода. Я следовал этой статье, и она работает для одной ссылки (https://swiftui -lab.com / bug-navigationlink-isactive / ). Однако при использовании списка ссылок необходимо использовать отдельное логическое значение для каждого NavigationLink.

Так что я подумал, что разумный способ сделать это с помощью EnvironmentObject, который содержит словарь с логическим значением для каждого ChildView:

class Navigation: ObservableObject{
    @Published var show:[UUID:Bool] = [:]
}

Допустим, мы хотим иметь дочерние представления с переменным числом (типа MyObject).

Что необходимо изменить, чтобы заставить его работать?

struct MyObject:Identifiable{
    var id = UUID()
    var name:String
}

struct ContentView: View {
    @EnvironmentObject var navigation:Navigation

    var objects = [MyObject(name: "view1"), MyObject(name: "view2"), MyObject(name: "view3")]

    init() {
        for object in objects{
            self.navigation.show[object.id] = false
        }
    }

    var body: some View {
        NavigationView{
            VStack{
                ForEach(objects, id:\.self.id){ object in
                    NavigationLink(destination: Child(object:object), isActive: self.$navigation.show[object.id], label: {
                        Text(object.name)
                    })
                }
            }
        }
    }
}

struct Child: View {
    @EnvironmentObject var navi:Navigation
    var object:MyObject

    var body: some View {
        Button(action:{self.navi.show[self.object.id] = false}, label: {
            Text("back")
        })
    }
}

1 Ответ

3 голосов
/ 25 октября 2019

Представление, к которому перемещается NavigationLink, имеет переменную среды, называемую presentationMode. Эта переменная позволяет программно переместить ваш дочерний вид обратно в родительский вид.

Таким образом, вместо того, чтобы отслеживать все состояния отображения, мы можем упростить вашу дочернюю структуру до следующего вида:

struct Child: View {
    @Environment(\.presentationMode) private var presentation

    var object:MyObject

    var body: some View {
        Button(action:{ self.presentation.wrappedValue.dismiss() }, label: {
            Text("back")
        })
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...