SwiftUI:不推荐使用NavigationDestinationLink

Ben*_*net 5 ios swift swiftui

在今天早上安装Xcode 11 beta 5之后,我注意到它NavigationDestinationLink已不推荐使用NavigationLink

另外,这就是苹果在发行说明中所说的:

NavigationDestinationLink和DynamicNavigationDestinationLink已弃用;它们的功能现在包含在NavigationLink中。(50630794)

我使用NavigationDestinationLink的方式是通过编程将新视图推入堆栈self.link.presented?.value = true。似乎没有该功能NavigationLink

有人知道吗?我宁愿不再使用NavigationDestinationLink它,因为它已被弃用...

谢谢!

更新: 实际上,这种NavigationDestinationLink方式不再起作用,所以我想我们无法以编程方式进行推送了吗?

更新2:

NavigationLink(destination: CustomView(), isActive: $isActive) {
    return Text("")
}
Run Code Online (Sandbox Code Playgroud)

这是可行的,但是当您传递isActive为true时,任何状态更新都将触发此代码并一遍又一遍地推送...此外,如果将其传递回false,它将弹出视图。不仅更新,如果将其设置isActivetrue,它还将推动视图(良好),并且如果我们按后退按钮,它将返回并立即再次推动,因为它仍然是正确的。玩onAppear是我的希望,但是回到它时并没有被要求……我不确定我们应该如何使用它。

kon*_*iki 7

花了一些时间之后NavigationLink(destination:isActive),我比过去更喜欢它NavigationDestinationLink。旧的观点有点令人困惑,而新的方法似乎更加优雅。一旦我弄清楚了如何在不使用动画的情况下进行推送,它将使应用程序启动时的状态恢复变得非常容易。

但是有一个问题,一个大而丑陋的错误。:-(

在此处输入图片说明

以编程方式推送视图可以正常工作,以编程方式弹出视图也可以。当我们在推入的视图中使用“返回”按钮时,问题就开始了,而每隔两次就会出现奇怪的行为。第一次弹出视图时,视图会弹出并立即再次推送。第二次工作正常。然后第三次重新开始。

我已经创建了一个错误报告(此处为数字)。我建议您也这样做并参考我的电话号码,以帮助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)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)