Динамическое назначение NavigationLink в SwiftUI? - PullRequest
0 голосов
/ 27 октября 2019

У меня есть представление 'B' с инициализатором, который принимает аргумент.

struct B: View {
    let arg: Int

    init(arg: Int) {
        self.arg = arg
    }

    var body: some View {
        Text("\(arg)")
    }
}

И у меня есть навигационное представление 'A'.

'A' имеет одну кнопку, который при нажатии показывает всплывающее окно, где пользователь выбирает число от 1 до 5. Закрытие типа (Int) -> Void вызывается с выбранным номером.

struct A: View {
    @State var showPicker = false

    var body: some View {
        NavigationView {
            Button(action: { self.showPicker = true }) {
                Text("Pick Number")
            }
            .sheet(isPresented: self.$showPicker, content: { 
                NumberPicker { number in 
                    *** Possible to navigate to B from here? ***
                } 
            })
        }
    }
}

Вопрос
Можно ли инициализировать представление B с результатом из закрытия, а затем выполнить навигациюк этому?

Раньше это было возможно с DynamicNavigationDestinationLink, однако Apple устарела и заявила в примечаниях к выпуску, что NavigationLink теперь содержит свои возможности. Я просмотрел документы, однако не смог выяснить, как использовать NavigationLink для получения того же результата.

1 Ответ

0 голосов
/ 27 октября 2019

Вам нужно добавить новый вид с другим навигационным обзором, где вы можете выбрать номер.

Вот полный пример кода, как я подхожу к этому:

import SwiftUI

struct viewA: View {

    var body: some View {
        NavigationView {
            NavigationLink(destination: viewC()) {
                Text("Pick Number")
            }
        }
    }
}

struct viewB: View {

    @Binding var showSheet: Bool
    @Binding var arg: Int

    var body: some View {
        NavigationView {
            List {
                ForEach((1...5), id: \.self) {number in
                    Button(action: {
                        self.arg = number
                        self.showSheet.toggle()
                    }) {
                        Text("\(number)")
                    }
                }
            }
        }
    }
}

struct viewC: View {

    @State var showSheet:Bool = true
    @State var arg: Int = 0

    var body: some View {
        NavigationView {
            Text("\(arg)")
        }
        .sheet(isPresented: $showSheet) {
            viewB(showSheet: self.$showSheet, arg: self.$arg)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...