我正在开发一个具有登录功能的应用程序,登录后列出了类别。在每个类别下,有一些项目水平列出。事情是登录后,主页出现,一切都很好。当您单击某个项目时,它会进入详细屏幕,但当您尝试返回时,它只会崩溃。我发现了这个流程 为什么我的 SwiftUI 应用程序在"导航视图"的"导航栏项"中放置"导航链接"后向后导航时崩溃?但我无法解决我的问题。由于我的项目变得复杂,我只想在 swiftui 中练习导航,并创建了一个新项目。顺便说一下,我下载了最新的 xcode 版本 11.3。我写了一个简单的代码,如下所示:
NavigationView{
NavigationLink(destination: Test()) {
Text("Show Detail View")
}
.navigationBarTitle("title1")
和 Test(( 视图如下:
import SwiftUI
struct Test: View {
var body: some View {
Text("Hello, World!")
}
}
struct Test_Previews: PreviewProvider {
static var previews: some View {
Test()
}
}
如您所见,它非常简单。我也在互联网上尝试了类似的例子,但它并没有按照它应该的方式工作。当我运行项目时,我单击导航链接,它会导航到 Test(( 视图。然后我单击后退按钮,它导航到主页。但是,当我第二次单击导航链接时,没有任何反应。导航链接仅工作一次,之后没有任何反应。它不导航,它不会抛出任何错误。我是 swiftui 的新手,一切都很棒,但导航。我在互联网上尝试了许多示例并提出了解决方案,但似乎没有什么可以解决我的问题。
[更新] 2020 年 11 月 5 日 - pawello2222 说此问题已在 Xcode 12.1 中修复。
[更新] 2020 年 6 月 14 日 - Quang Hà 说这个问题在 Xcode 11.5 中又回来了。
[更新] 2020 年 2 月 12 日 - 我在 Xcode 11.4 beta 中检查了此问题,发现此问题已解决。
当我在 Xcode 的模拟器中测试它时,我的项目中也遇到了同样的问题。但是,当我在真实设备(带有iOS 13.3的iPhone X(上启动该应用程序时,NavigationLink
工作正常。所以,它确实看起来像Xcode的错误。
模拟器11.4:此问题已修复
您需要在第二个视图中重置默认isActive
值。 它适用于设备和模拟器。
struct NavigationViewDemo: View {
@State var isActive = false
var body: some View {
NavigationView {
VStack {
Text("View1")
NavigationLink(
destination: NavigationViewDemo_View2(isActive: $isActive),
isActive: $isActive,
label: { Button(action: { self.isActive = true }, label: { Text("click") }) })
}
}
}
}
struct NavigationViewDemo_View2: View {
@Binding var isActive: Bool
var body: some View {
Text("View2")
.navigationBarItems(leading: Button(action: { self.isActive = false }, label: { Text("Back") }))
}
}
当 Apple 修复阻止 13.3 作为部署目标的相关错误时,这个问题可能会得到解决。
我遇到了与其他人相同的问题。此问题存在于运行 13.2 的模拟器和预览版中,但在部署到运行 13.3 的我自己的设备时已修复。
正如@Александр Грабовский 说它看起来像一个 Xcode 11.3 错误,我遇到了同样的问题,您必须降级或使用一些解决方法,例如自定义后退按钮,如下所示
struct ContentView: View {
@State private var pushed: Bool = false
var body: some View {
NavigationView {
VStack {
Button("Show Detail View") {
self.pushed.toggle()
}
NavigationLink(destination: Test(pushed: $pushed), isActive: $pushed) { EmptyView() }
}.navigationBarTitle("title1")
}
}
}
struct Test: View {
@Binding var pushed: Bool
var body: some View {
Text("Hello, World!")
.navigationBarBackButtonHidden(true)
.navigationBarItems(leading: BackButton(label: "Back") {
self.pushed = false
})
}
}
struct BackButton: View {
let label: String
let closure: () -> ()
var body: some View {
Button(action: { self.closure() }) {
HStack {
Image(systemName: "chevron.left")
Text(label)
}
}
}
}
对于与其他版本的iOS有相同症状的人,而不是其他答案识别的错误测试版,您可能会看到这种行为还有另一个原因。
如果您的NavigationLink
嵌套在另一个NavigationLink
中,则内部NavigationLink
将只工作一次,除非您将isDetailLink(false)
添加到外部链接。