自动弹出导航链接问题

Posted

技术标签:

【中文标题】自动弹出导航链接问题【英文标题】:Auto pop navigation link issue 【发布时间】:2021-12-28 19:31:56 【问题描述】:

我对通过导航链接推送的 auto view poping 视图有疑问。 在我的ContentView 上是一个可以在几秒钟后更改的列表,但是如果我在它之前推送一个新视图,新数据出现后会自动弹出新视图。这是意想不到的行为。是 SwiftUI 3 的错误还是我的错误? ios 15 上的问题

我的视图模型

    class ViewModel: ObservableObject 
       @Published var list: [Int] = [1, 2, 3, 4, 5, 6, 7, 8]

       func changeAfterTime() 
           DispatchQueue.main.asyncAfter(deadline: .now() + 2.0)  [weak self] in
               self?.list = [9,10,11]
           
       
    

我的内容视图

    struct ContentView: View 

        @EnvironmentObject var viewModel: ViewModel
        @State private var selection: Int?

        var body: some View 
            NavigationView 
               List(viewModel.list, id: \.self)  element in
                   VStack 
                       Text(element, format: .number)
                       NavigationLink("", tag: element, selection: $selection) 
                           TestView()
                   
                   .opacity(.zero)
               
           
           .onAppear 
               viewModel.changeAfterTime()
           
       
     
   

struct TestView: View 
    var body: some View 
        Text("Wait")
    

我附上了一个关于这个问题的视频

【问题讨论】:

【参考方案1】:

在重新创建视图时,活动的NavigationLink 与元素一起被删除,因为绑定发生了变化。这会导致视图以动画方式返回到初始列表。

如果您在 2 秒后将值 8 添加到您设置的值列表中,并且您最初从列表中选择 8,您可以观察到它不会弹出 TestView,因为元素 8 及其关联的视图部分(包括NavigationLink)不会被删除,但如果您选择了 1 到 7 中的任何一个值,它仍然会被删除。

【讨论】:

嘿@Charles A. 我知道这个案子,但不是我的。我对 2 秒后数组更改后是否有可能保留现有视图感兴趣。 @PiterPan 啊,那不是你的问题。您可能可以在列表之外设置一个NavigationLink(不是每行中的),当您的列表更改时不会被删除,然后使用每个列表元素中的按钮设置触发NavigationLink 的状态值。跨度>

以上是关于自动弹出导航链接问题的主要内容,如果未能解决你的问题,请参考以下文章

退出时返回两层的导航链接

iOS 简单视图从导航堆栈错误弹出

JSF 中“返回”导航链接的最佳实践

从导航控制器弹出时如何保持在同一个选项卡中

谁能帮写一个点击链接自动弹出提示窗口的js代码?

当我在 jQuery Mobile 中单击弹出窗口上的链接时,如何防止在第一个输入项上自动对焦