【问题标题】:NavigationLink Bug导航链接错误
【发布时间】:2021-03-12 21:25:47
【问题描述】:

我有这两种观点:

import SwiftUI
import QGrid

struct CategoriasCanales: View {
    @Binding var logueado:Bool
    @ObservedObject var categorias = CargarCategoriasCanales()
    
    var body: some View {
        NavigationView{
            QGrid(self.categorias.listaCategoriasCanales, columns: 3){item in
                NavigationLink(destination:VerCanales(categoria: item.categoryID)){
                    Text(item.categoryName).frame(width:400, height:50)
                }
            }
            
        }
    }
}

import SwiftUI
import QGrid

struct VerCanales: View {
    
   
    private var categoria: String
    @ObservedObject private var canales: CargarCanales
  
    init(categoria: String) {
        print(categoria)
            self.categoria = categoria
            self.canales = CargarCanales(categoriaID: categoria)
        }
    
    var body: some View {
        NavigationView{
            QGrid(self.canales.listaCanales, columns: 3){item in
                NavigationLink(destination:PlayerVersa(canalID: item.streamID)){
                    Text(item.name).frame(width:400, height:50)
            
                }
          
            }
            
        }
    }
}

问题是当我进入“CategoriasCanales”视图时,它运行“VerCanales”视图的初始化次数等于类别数。

我是 SwiftUI 的新手,例如在 DART 中,ChannelView 初始化中的 Print() 只会打印我作为参数发送的类别,而不是所有类别。

【问题讨论】:

    标签: swift swiftui swiftui-navigationlink


    【解决方案1】:

    NavigationLink 会创建目标视图来代替初始化,因此您会看到名为 VerCanales.init 的数量与 self.categorias.listaCategoriasCanales 一样多。

    我假设您想推迟创建 VerCanales:(使用 DeferView 来自 https://stackoverflow.com/a/61242931/12299030

    NavigationLink(destination:DeferView { VerCanales(categoria: item.categoryID) }){
        Text(item.categoryName).frame(width:400, height:50)
    }
    

    注意:VerCanales 中不需要第二个 NavigationView,导航堆栈中应该只有一个导航视图,并且 CategoriasCanales 中已经有一个导航视图

    【讨论】:

      【解决方案2】:

      尝试使用 onAppear 代替 init

          var body: some View {
              NavigationView{
                  QGrid(self.canales.listaCanales, columns: 3){item in
                      NavigationLink(destination:PlayerVersa(canalID: item.streamID)){
                          Text(item.name).frame(width:400, height:50)
                  
                      }
                
                  }
                  
              }
              .onAppear {
                  print(categoria)
                  self.categoria = categoria
                  self.canales = CargarCanales(categoriaID: categoria)
              }
          }
      

      【讨论】:

      • 感谢您的帮助,我不能使用 .onAppear() 因为我需要在初始化之前捕获变量才能将它们作为 ObservedObject 的参数传递
      猜你喜欢
      • 1970-01-01
      • 2023-02-03
      • 1970-01-01
      • 2021-11-21
      • 2016-08-11
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多