【问题标题】:how to deal with swiftui @State optional unwrap如何处理 swiftui @State optional unwrap
【发布时间】:2020-11-02 02:58:17
【问题描述】:

在 swiftui 中,我有一个状态变量 count,它是可选的,在当前的工作表中,我打开可选的并显示 Detailview,但它似乎从来没有打到那里。

知道为什么不去那里吗?

它似乎永远不会命中

DetailView(count: num)

     import SwiftUI
        struct ContentView: View {
            @State var showDetailView = false
           @State var count : Int?
        var testArr = [1,2,3,4,5]
        var body: some View {
            
            NavigationView {
                List(testArr.indices){ indice in
                    Text("row num \(indice)")
                        .onTapGesture{
                            
                            self.showDetailView = true
                            self.count = 5
                            }
                    
                    }
                    .sheet(isPresented: self.$showDetailView) {
                    
                        if let num = self.count{
                            
                        //never hit here
                        DetailView(count: num)
                        }
                    
                    }
                
                    .navigationBarTitle("Your Reading")
            }
            }
        }
    
        struct ContentView_Previews: PreviewProvider {
            static var previews: some View {
                ContentView()
            }
        }
    
    struct DetailView: View {
    
        var count: Int
    
        var body: some View {
                if count == 5 {
                     Text("5555")
                } else {
                    EmptyView()
                }
    
             }
        }

【问题讨论】:

    标签: swiftui state optional


    【解决方案1】:

    问题不在于可选的展开。 问题是您在计算正文时正在执行更新以计数。为了克服这个问题,使用我的解决方案: swiftui state variable count lost what it stored

    如果该解决方案不适合您,请告诉我。

    如果您确实必须使用 @State var count,则可以使用此解决方法(不推荐)。

                          DispatchQueue.main.async {
                            self.count = 5
                        }
    

    【讨论】:

      【解决方案2】:

      您可以使用sheet(item:content:) 代替sheet(isPresented:content:)

      struct ContentView: View {
          @State var count: Int?
          var testArr = [1, 2, 3, 4, 5]
      
          var body: some View {
              NavigationView {
                  List(testArr.indices) { index in
                      Text("row num \(index)")
                          .onTapGesture {
                              self.count = 5
                          }
                  }
                  .sheet(item: $count) { count in
                      DetailView(count: count)
                  }
                  .navigationBarTitle("Your Reading")
              }
          }
      }
      

      注意item 必须符合Identifiable,因此您需要使用自己的结构或创建Int 扩展:

      extension Int: Identifiable {
          public var id: Int { self }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-10-25
        • 1970-01-01
        • 1970-01-01
        • 2020-10-05
        • 2013-12-12
        • 1970-01-01
        • 2021-11-30
        • 2019-11-10
        • 1970-01-01
        相关资源
        最近更新 更多