В SwiftUI вы должны использовать NavigationView
и NavigationLink
для навигации. Вы также можете использовать NavigationView
и NavigationLink
для программной навигации с этим API, принадлежащим структуре NavigationLink
:
/// Creates an instance that presents `destination` when active.
public init(destination: Destination, isActive: Binding<Bool>, @ViewBuilder label: () -> Label)
Итак, вы можете сделать что-то подобное (точный код может зависеть от того, чтовам действительно нужно получить):
class ContentViewModel: ObservableObject {
@Published var navigate = false
init() {
DispatchQueue.main.asyncAfter(deadline: .now()+2) { //navigate after 2 secs
self.navigate = true
}
}
}
struct ContentView: View {
@ObservedObject var contentViewModel = ContentViewModel()
var body: some View {
NavigationView {
ZStack {
Text("Hello World!")
NavigationLink(destination: DetailView(), isActive: $contentViewModel.navigate) {
EmptyView() //you don't need a view if you want to navigate programmatically
}
}
}
}
}
struct DetailView: View {
var body: some View {
Text("Navigation complete!")
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
К сожалению, в SwiftUI есть ошибка: если вы запустите приведенный выше код, вы увидите, что нажатие кнопки «Назад» в подробном представлении заставляет представление содержимого перемещаться сновав подробный вид. Только однажды. Если вы снова нажмете кнопку «Назад», ошибка больше не будет возникать. Это известная проблема (мы все ждем, пока Apple исправит это). Вы можете переопределить кнопку возврата по умолчанию, чтобы решить эту проблему. Это обходной путь, но сейчас мы не можем добиться большего успеха:
class ContentViewModel: ObservableObject {
@Published var navigate = false
init() {
DispatchQueue.main.asyncAfter(deadline: .now()+2) {
self.navigate = true
}
}
}
struct ContentView: View {
@ObservedObject var contentViewModel = ContentViewModel()
var body: some View {
NavigationView {
ZStack {
Text("Hello World!")
NavigationLink(destination: DetailView(contentViewModel: contentViewModel), isActive: $contentViewModel.navigate) {
EmptyView()
}
}
}
}
}
struct DetailView: View {
@ObservedObject var contentViewModel: ContentViewModel
var body: some View {
Text("Navigation complete!")
.navigationBarBackButtonHidden(true)
.navigationBarItems(leading: Text("Back").onTapGesture { //this is just an example, it's a plain text
self.contentViewModel.navigate = false
})
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}