如何处理 swiftui @State optional unwrap

Posted

技术标签:

【中文标题】如何处理 swiftui @State optional unwrap【英文标题】:how to deal with 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()
                
    
             
        

【问题讨论】:

【参考方案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 

【讨论】:

以上是关于如何处理 swiftui @State optional unwrap的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:如何处理 BLE 响应并显示新值

机器学习模型如何获得可重复的结果?最佳实践是什么?如何处理random_state参数?

Xcode UI测试如何处理UNUserNotificationCenter生成的通知权限

Lua如何处理堆栈?

SwiftUI之深入解析如何处理特定的数据和如何在视图中适配数据模型对象

如何处理以设置间隔卸载组件以避免内存泄漏