NavigationLink 只工作一次
NavigationLink Works Only for Once
我正在开发一个需要登录的应用程序,登录后会列出类别。在每个类别下,都有一些横向列出的项目。事情是在登录后,主页出现,一切都很好。当您单击某个项目时,它会进入详细屏幕,但当您尝试返回时,它就会崩溃。我发现了这个流程 但我无法解决我的问题。由于我的项目变得复杂,我只是想在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()
}
}
如您所见,它非常简单。我也在互联网上尝试过类似的例子,但它并没有按照预期的方式工作。当我 运行 项目时,我单击导航 link 并导航到 Test() 视图。然后我点击后退按钮,它导航到主页。但是,当我第二次单击导航 link 时,没有任何反应。导航 link 只工作一次,之后什么也没有发生。它不导航,它不会抛出任何错误。我是 swiftui 的新手,除了导航之外一切都很棒。我在互联网上尝试了很多示例和建议的解决方案,但似乎无法解决我的问题。
正如@Александр Γрабовский 所说,它似乎是一个 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)
}
}
}
}
[更新] 2020 年 11 月 5 日 - pawello2222 表示此问题已在 Xcode 12.1.
中修复
[更新] 2020 年 6 月 14 日 - Quang Hà 表示此问题已在 Xcode 11.5 中再次出现。
[更新] 2020 年 2 月 12 日 - 我在 Xcode 11.4 beta 中检查了这个问题,发现这个问题已经解决。
当我在 Xcode 的模拟器中测试它时,我在我的项目中也遇到了同样的问题。但是,当我在真实设备(iPhone X 和 iOS 13.3)上启动该应用程序时,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 修复 the related bug that prevents 13.3 from being selectable as a deployment target 时解决。
我遇到了和其他人一样的问题。此问题存在于模拟器和预览版 运行 13.2 中,但在部署到我自己的设备时已修复 运行 13.3.
对于与其他版本的 iOS 有相同症状而不是其他答案确定的错误测试版的任何人,您可能会看到此行为的另一个原因。
如果您的 NavigationLink
嵌套在另一个 NavigationLink
中,则内部 NavigationLink
将只能工作一次,除非您将 isDetailLink(false)
添加到外部 link .
我正在开发一个需要登录的应用程序,登录后会列出类别。在每个类别下,都有一些横向列出的项目。事情是在登录后,主页出现,一切都很好。当您单击某个项目时,它会进入详细屏幕,但当您尝试返回时,它就会崩溃。我发现了这个流程
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()
}
}
如您所见,它非常简单。我也在互联网上尝试过类似的例子,但它并没有按照预期的方式工作。当我 运行 项目时,我单击导航 link 并导航到 Test() 视图。然后我点击后退按钮,它导航到主页。但是,当我第二次单击导航 link 时,没有任何反应。导航 link 只工作一次,之后什么也没有发生。它不导航,它不会抛出任何错误。我是 swiftui 的新手,除了导航之外一切都很棒。我在互联网上尝试了很多示例和建议的解决方案,但似乎无法解决我的问题。
正如@Александр Γрабовский 所说,它似乎是一个 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)
}
}
}
}
[更新] 2020 年 11 月 5 日 - pawello2222 表示此问题已在 Xcode 12.1.
中修复[更新] 2020 年 6 月 14 日 - Quang Hà 表示此问题已在 Xcode 11.5 中再次出现。
[更新] 2020 年 2 月 12 日 - 我在 Xcode 11.4 beta 中检查了这个问题,发现这个问题已经解决。
当我在 Xcode 的模拟器中测试它时,我在我的项目中也遇到了同样的问题。但是,当我在真实设备(iPhone X 和 iOS 13.3)上启动该应用程序时,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 修复 the related bug that prevents 13.3 from being selectable as a deployment target 时解决。
我遇到了和其他人一样的问题。此问题存在于模拟器和预览版 运行 13.2 中,但在部署到我自己的设备时已修复 运行 13.3.
对于与其他版本的 iOS 有相同症状而不是其他答案确定的错误测试版的任何人,您可能会看到此行为的另一个原因。
如果您的 NavigationLink
嵌套在另一个 NavigationLink
中,则内部 NavigationLink
将只能工作一次,除非您将 isDetailLink(false)
添加到外部 link .