今天早上安装 Xcode 11 beta 5 后,我注意到 NavigationDestinationLink
已弃用,取而代之的是 NavigationLink
。
此外,这就是 Apple 在发行说明中所说的:
NavigationDestinationLink and DynamicNavigationDestinationLink are deprecated; their functionality is now included in NavigationLink. (50630794)
我使用 NavigationDestinationLink 的方式是通过 self.link.presented?.value = true
以编程方式将新 View 推送到堆栈中。 NavigationLink
中似乎没有该功能。
有人知道吗?
我不想再使用 NavigationDestinationLink
,因为它已被弃用......
谢谢!
更新:
实际上,NavigationDestinationLink
方式不再有效,所以我想我们无法再以编程方式推送?
更新 2:
NavigationLink(destination: CustomView(), isActive: $isActive) {
return Text("")
}
这行得通,但是当您将 isActive
传递给 true 时,任何状态更新都会触发此代码并一遍又一遍地推送...另外,如果您将它传回给 false
,它将弹出 View 。
不仅是更新,如果你将 isActive
设置为 true
,它会推送 View (好),如果我们按下后退按钮,它会返回然后立即再次推送,因为这仍然是真的。
玩 onAppear
是我的希望,但回到它时它没有被调用......
我不确定我们应该如何使用它。
最佳答案
在使用 NavigationLink(destination:isActive)
一段时间后,我比旧的 NavigationDestinationLink
更喜欢它。旧的 View 有点困惑,而新的方法看起来更优雅。一旦我弄清楚如何在没有动画的情况下进行推送,这将使应用程序启动时的状态恢复变得非常容易。
但是有一个问题,一个又大又丑的错误。 :-(
以编程方式推送 View 工作正常,以编程方式弹出 View 也可以。当我们在推送 View 中使用 BACK 按钮时,问题就开始了,它每隔一段时间就会表现得很奇怪。第一次弹出 View 时, View 会立即弹出并再次推送。第二次它工作正常。然后第三次重新开始。
我已经创建了一个错误报告 ( number here )。我建议您也这样做并引用我的电话号码,以帮助 Apple 将它们组合在一起并引起更多关注。
我设计了一个解决方法,基本上包括用我们自己的替换默认的后退按钮:
class Model: ObservableObject {
@Published var pushed = false
}
struct ContentView: View {
@EnvironmentObject var model: Model
var body: some View {
NavigationView {
VStack {
Button("Push") {
// view pushed programmatically
self.model.pushed = true
}
NavigationLink(destination: DetailView(), isActive: $model.pushed) { EmptyView() }
}
}
}
}
struct DetailView: View {
@EnvironmentObject var model: Model
var body: some View {
Button("Bring me Back (programatically)") {
// view popped programmatically
self.model.pushed = false
}
// workaround
.navigationBarBackButtonHidden(true) // not needed, but just in case
.navigationBarItems(leading: MyBackButton(label: "Back!") {
self.model.pushed = false
})
}
}
struct MyBackButton: View {
let label: String
let closure: () -> ()
var body: some View {
Button(action: { self.closure() }) {
HStack {
Image(systemName: "chevron.left")
Text(label)
}
}
}
}
关于ios - SwiftUI:不推荐使用 NavigationDestinationLink,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57273717/