SwiftUI 中的可选状态或绑定

Posted

技术标签:

【中文标题】SwiftUI 中的可选状态或绑定【英文标题】:Optional State or Binding in SwiftUI 【发布时间】:2021-04-02 08:21:12 【问题描述】:

我想询问有关 SwiftUI 行为的问题 当我使用.onChange( value)

为什么如果我使用带有可选类型的@State var some: SomeType? 然后@Binding var some: SomeType这个操作符只检测到变化 它从某个 SomeType 值变为 nil ,反之亦然。 但是对底层对象值的更改不会被检测为更改

例如。 @Binging var progress: Int?

将进度从 nil 更改为 100 检测更改 但是如果我将值从 1 -> 2 -> 3 更改,它们将被跳过 如果我使用@Binding var progress: Int,它会起作用

知道如何在 onChange() 中使用 Optionals 吗?

【问题讨论】:

在这里工作正常(如果将可选绑定到可选,则不允许将非可选直接绑定到可选)。你会提供可重现的演示代码吗? 【参考方案1】:

这是可选的带有状态和绑定的工作示例:


import SwiftUI

struct ContentView: View 
    
    @State private var progress: Int?
    
    var body: some View 
        
        CustomView(progress: $progress)
        
    


struct CustomView: View 
    
    @Binding var progress: Int?
    
    var body: some View 
        
        Button("update") 
            
            if let unwrappedInt = progress  progress = unwrappedInt + 1  
            else  progress = 0          //<< █ █ Here: initializing! █ █
            
        
        .onChange(of: progress)  newValue in
            
            if let unwrappedInt = progress  print(unwrappedInt) 
            
        

    

【讨论】:

是的。我一直在使用进度?然后 progress.completedUnitCount += 1 不起作用。但是每次 new let newProgress = .. 都创建新实例解决了这个问题 Int?对我也不起作用,但也许它不起作用导致其他错误。如果它不起作用,您应该创建新的对象实例并将其分配给@State/@Binding

以上是关于SwiftUI 中的可选状态或绑定的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 中的可选绑定

SwiftUI 文本字段中的可选链接绑定值

SwiftUI - 我们如何重新绑定绑定的可选参数?

可选字符串数组作为绑定参数 SwiftUI [重复]

Combine + SwiftUI 中的最佳数据绑定实践?

将 SwiftUI 警报或操作表绑定到值类型模型属性的可选性(当属性为 nil 时显示视图)的好方法是啥?