У меня есть базовое представление с кнопкой, использующей SwiftUI, и я пытаюсь представить новый экран/представление при нажатии кнопки. Как мне это сделать? Должен ли я создать делегата для этого представления, который сообщит приложению о SceneDelegateпредставлении нового контроллера представления?
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
Text("Hello World")
Button(action: {
//go to another view
}) {
Text("Do Something")
.font(.largeTitle)
.fontWeight(.ultraLight)
}
}
}
}
Решение проблемы
Это не должно было быть здесь лучшим ответом, а скорее альтернативным методом, если вам не нужна панель навигации. См. Ответ Джейка ниже, чтобы узнать, как это сделать с помощью NavigationView& NavigationLink. Надеюсь, это все еще полезно или укажет вам правильное направление.
Если вы просто пытаетесь получить NavigationLinkработу с Binding, вы можете использовать ту же NavigationLinkинициализацию, что и я, с isActiveпараметром привязки.
Впрочем, вернемся к ответу…
Я сделал модификатор представления для этого. Это также означает, что нет панели навигации. Вы можете назвать это так:
.navigate(to: MainPageView(), when: $willMoveToNextScreen)
Его можно прикрепить к чему угодно, поэтому я обычно прикрепляю его к концу тела, например:
@State private var willMoveToNextScreen = false
var body: some View {
VStack {
/*... */
}
.navigate(to: MainPageView(), when: $willMoveToNextScreen)
}
Код (не забудьте import SwiftUI):
extension View {
/// Navigate to a new view.
/// - Parameters:
/// - view: View to navigate to.
/// - binding: Only navigates when this condition is `true`.
func navigate<NewView: View>(to view: NewView, when binding: Binding<Bool>) -> some View {
NavigationView {
ZStack {
self
.navigationBarTitle("")
.navigationBarHidden(true)
NavigationLink(
destination: view
.navigationBarTitle("")
.navigationBarHidden(true),
isActive: binding
) {
EmptyView()
}
}
}
.navigationViewStyle(.stack)
}
}
Комментариев нет:
Отправить комментарий