ios - SwiftUI:不推荐使用 NavigationDestinationLink

标签 ios swift swiftui

今天早上安装 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 有点困惑,而新的方法看起来更优雅。一旦我弄清楚如何在没有动画的情况下进行推送,这将使应用程序启动时的状态恢复变得非常容易。

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

enter image description here

以编程方式推送 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/

相关文章:

ios - SWIFT - Realm 数据库加密不起作用

ios - 如何在 Lottie 中应用颜色叠加

ios - SpriteKit (Swift) 方向改变

ios - 如何在 Swift 中从大到小排列双数组?

swiftui - Xcode 12/iOS14 WidgetKit "@main and must provide a main static function"错误

appdelegate - 如何使用@EnvironmentObject 在 SwiftUI 中的 AppDelegate 和 SceneDelegate/Views 之间共享数据

uitextfield - SwiftUI 将图像添加到文本字段的左侧

ios - 异步调用中的异步调用未执行

ios - 打开指向可点击标签的链接 (RTLabel)

ios - 如何根据 subview 的高度设置堆栈 View 的高度?