【发布时间】:2020-02-13 22:27:21
【问题描述】:
我正在尝试从一个视图到另一个视图进行简单的 SwiftUI 导航,然后使用 条形按钮项。我尝试了三种不同的方法来调用新视图。 在正文视图中使用 Button 有效,但在导航中使用 NavigationBarItems bar 以两种不同的方式失败。
这是开始视图:
struct ContentView: View {
@State private var showSecondView = false
var body: some View {
NavigationView {
VStack {
Text("This is the content view")
.navigationBarTitle("Nav Title")
//this works ONCE only:
.navigationBarItems(trailing: Button(action: {self.showSecondView.toggle()}) {
Text("SecondView")
})
//this always fails on return to contentview with error:
//Tried to pop to a view controller that doesn't exist
// .navigationBarItems(trailing:
// NavigationLink(destination: SecondView()) {
// Text("SecondNav")
// }
// )
//This always works:
Button(action: {self.showSecondView.toggle()} ) {
Text("Call Modal Second View")
}.padding()
Text(self.showSecondView ? "true" : "false")
}.sheet(isPresented: $showSecondView) {
SecondView()
}
}
}
}
如果我在 NavigationBarItems 中使用 NavigationLink,则会显示 SecondView,但是 返回 ContentView 时,它会因错误而崩溃:“试图弹出到视图 不存在的控制器”
如果我在 NavigationBarItems 中使用按钮,则可以转换到 SecondView 一次且只有一次。返回 ContentView 有效,但按钮不再起作用。 有趣的是,如果采取的第一个动作是使用 Body 中的 Button, NavigationBarItem 一次都不起作用。
还有简单的 SecondView:
struct SecondView: View {
@Environment(\.presentationMode) var presentation
var body: some View {
NavigationView {
VStack{
Text("This is the second view")
Button(action: { self.presentation.wrappedValue.dismiss()}) {
Text("Dismiss Modal")
}.padding()
}
}
}
}
我很困惑。任何指导将不胜感激。 Xcode 11.2 (11B44)、Catalina 10.15
【问题讨论】:
-
工作正常,我正在运行相同版本的 Xcode。我可以从
Call Modal Second View按钮或右上角的SecondView按钮一遍又一遍地打开和关闭SecondView,没有任何问题。取消注释代码并使用尾随NavigationLink(..)也可以正常工作。 -
嗯。这真是令人困惑。我会尝试清理并重新启动 Xcode。谢谢。
-
如果这意味着什么,我正在运行 iOS 13.1.2。
-
我清理并重新启动了 Xcode 和模拟器,并且行为是相同的 - 但它确实适用于真实设备。该设备是 13.1.3。所以我想这只是一个模拟器错误。只是为了让它更奇怪,即使在模拟器中,如果我向下滑动以关闭 SecondView(而不是使用关闭按钮),那么导航按钮也每次都有效。猜猜我现在一直在使用设备。
-
我注意到一些奇怪的怪癖,比如模拟器与设备的行为略有不同。我建议您在通过错误报告遇到这些问题时提出这些问题 - developer.apple.com/bug-reporting