我正在处理具有登录名的应用程序,登录后列出了类别。在每个类别下,都有一些水平列出的项目。事情是登录后,出现主页,所有内容都列出了。当您单击某个项目时,它会转到详细屏幕,但是当您尝试返回时,它就会崩溃。我发现了此流程Why does my SwiftUI app crash when navigating backwards after placing a `NavigationLink` inside of a `navigationBarItems` in a `NavigationView`?,但无法解决问题。由于我的项目变得复杂,我只想在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的新手,除了导航之外,其他所有方面都很出色。我在互联网上尝试了许多示例并提出了解决方案,但似乎没有什么可以解决我的问题。
答案 0 :(得分:8)
模拟器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") }))
}
}
答案 1 :(得分:3)
当我在Xcode的模拟器中进行测试时,我的项目中也遇到了同样的问题。但是,当我在真实设备(带有iOS 13.3的iPhone X)上启动该应用程序时,NavigationLink
可以正常工作。因此,它的确确实像Xcode的bug。
答案 2 :(得分:3)
大概这将在Apple修复the related bug that prevents 13.3 from being selectable as a deployment target时解决。
我遇到了与其他所有人相同的问题。在运行13.2的模拟器和预览版中存在此问题,但在将其部署到运行13.3的我自己的设备时已解决。
答案 3 :(得分:1)
对于在其他版本的 iOS 上遇到相同症状而不是其他答案确定的错误测试版的任何人,您可能会看到这种行为的另一个原因。
如果您的 NavigationLink
嵌套在另一个 NavigationLink
中,则内部 NavigationLink
将只工作一次,除非您将 isDetailLink(false)
添加到外部链接。
答案 4 :(得分:0)
正如@АлександрГрабовский所说,它似乎是一个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)
}
}
}
}