【问题标题】:Optional State or Binding in SwiftUISwiftUI 中的可选状态或绑定
【发布时间】: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 吗?

【问题讨论】:

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

标签: swift swiftui


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多