SwiftUI:导航目的地链接已弃用

rlcwz9us  于 2022-12-26  发布在  Swift
关注(0)|答案(5)|浏览(185)

在今天早上安装了Xcode 11 beta 5之后,我注意到NavigationDestinationLink被弃用了,取而代之的是NavigationLink
此外,苹果在发布说明中也是这么说的:
不推荐使用导航目的地链接和动态导航目的地链接;其功能现在包含在NavigationLink中。(50630794)
我使用NavigationDestinationLink的方式是通过self.link.presented?.value = true以编程方式将新视图推送到堆栈中,NavigationLink中似乎没有该功能。
有什么想法吗?我宁愿不再使用NavigationDestinationLink,因为它已经过时了...
谢谢大家!

    • 更新:**实际上,NavigationDestinationLink方式不再起作用了,所以我想我们再也没有办法通过编程方式推送了?
    • 更新2:**
NavigationLink(destination: CustomView(), isActive: $isActive) {
    return Text("")
}

这是可行的,但是当你把isActive设置为true时,任何状态更新都会触发这段代码,并不断地推送......而且,如果你把它传递回false,它会弹出视图。(好)如果我们按下后退按钮,它将返回,然后立即再次推送,因为它仍然是真的。玩onAppear是我的希望,但它没有被调用时,返回它...我不知道我们如何' We "我们应该用这个。

eaf3rand

eaf3rand1#

在花了一些时间使用NavigationLink(destination:isActive)之后,我对它的喜爱程度远远超过了以前的NavigationDestinationLink。以前的视图有点混乱,而新的方法似乎优雅得多。一旦我弄清楚如何在没有动画的情况下推送,它将使应用程序启动时的状态恢复变得非常容易。
不过有一个问题,一只又大又丑的虫子

通过编程方式推送一个视图可以正常工作,通过编程方式弹出也可以。当我们在推送的视图中使用BACK按钮时,问题就出现了,它每隔一次都会表现得很奇怪。第一次弹出视图时,视图会立即弹出并再次推送。第二次运行正常。然后第三次又重新开始。
我已经创建了一个bug报告(number here)。我建议你也这样做,并参考我的号码,以帮助苹果将它们组合在一起,并获得更多的关注这个问题。
我设计了一个变通方案,基本上包括用我们自己的按钮替换默认的后退按钮:

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)
            }
        }
    }
}
mf98qq94

mf98qq942#

要改进解决方法而不用自定义按钮替换后退按钮,可以使用上面的代码:

NavigationLink(destination: Test().onAppear(perform: {
    self.editPushed = nil
}), tag: 1, selection: self.$editPushed) {
    Button(action: {
        self.editPushed = 1
    }) {
        Image(systemName: "plus.app.fill")
            .font(.title)
    }
}

onAppear块将擦除选择值,防止显示详细视图两次

20jt8wwn

20jt8wwn3#

您也可以使用导航链接(目的地:标记:选择)

NavigationLink(destination: MyModal(), tag: 1, selection: $tag) {
    EmptyView()
}

所以你可以通过编程方式将tag设置为1来推送MyModal,这种方法和Bool绑定变量的方法有着相同的行为,所以当你第一次弹出时,它会立即推送视图,希望他们能在下一个测试版中修复它。
与DynamicNavigationDestinationLink相比,我认为这种方法的唯一缺点是,即使不需要,也需要提供一个View to NavigationLink。希望他们能找到一种更干净的方法,允许我们以编程方式推送。

disho6za

disho6za4#

解决方案是为您的详细信息视图创建自定义后退按钮,并手动弹出详细信息视图。

.navigationBarItems(leading:
                Button(action: {
                    self.showDetail = false
                }) {
                    Image(systemName: "chevron.left").foregroundColor(.red)
                        .font(.system(size: 24, weight: .semibold))
                    Text("Back").foregroundColor(.red)
                    .font(.system(size: 19))
                }
            )
7z5jn7bk

7z5jn7bk5#

所选答案中使用的方法再次被弃用。以下是从此answer复制到此post中的解决方案。

@State private var readyToNavigate : Bool = false

    var body: some View {
        NavigationStack {
           VStack {
              Button {
                  //Code here before changing the bool value
                  readyToNavigate = true
              } label: {
                  Text("Navigate Button")
              }
          }
           .navigationTitle("Navigation")
           .navigationDestination(isPresented: $readyToNavigate) {
              MyTargetView()
          }
       }
   }

相关问题