视图中断初始化器中的SwiftUI可取消?

0h4hbjxa  于 2023-11-16  发布在  Swift
关注(0)|答案(2)|浏览(121)

为什么当我将计时器添加到视图时,这段代码不正确:

class Dummy {
    
}

struct DemoView: View {
    
    @State var timer: Cancellable? = nil
    
    @State var dummy: Dummy
    
    
    init(dummy_in: Dummy) {
        dummy = dummy_in //>>> ERROR: Variable 'self.dummy' used before being initialized
        
        // SOME MORE LOGIC HERE
    }
    
    
    var body: some View {
        Text("Dummy")
    }
    
}

字符串
它工作得很好,直到我添加了一个计时器,它是用nil初始化的,因为它是空的。
这是非常不直观的行为
编辑:当我将dummy更改为@ObservedObject时,它确实有效。仍然想了解这里发生了什么

zqdjd7g9

zqdjd7g91#

苹果表示,关于State(wrappedValue value: Value)
你不能直接调用这个初始化器。
https://developer.apple.com/documentation/swiftui/state/init(wrappedvalue:)
您可以使用

_dummy = State(initialValue: dummy_in)

字符串
另外,请记住,State是一个真实的来源,而不是来自父节点,它处理View的身份,当父节点试图给予值时,通常会有更多的断开。
State也应该总是标记为private,这样就不会创建memberwise初始化器。
https://developer.apple.com/documentation/swiftui/state
init在SwiftUI中并不是一个好主意,SwiftUI可以随时重新创建View,计时器可能会导致View被重新创建。

cetgtptt

cetgtptt2#

要将数据传递到View中,则为let(仅就绪)或@Binding var(读/写),例如

@Binding var dummy: Dummy

字符串
在这两种情况下,body都是在值被改变时被调用的。因为它只适用于值类型,所以Dummy必须被改变为结构体:

struct Dummy {
    mutating func someLogic { }  
}


仅供参考,计时器使用TimelineView

相关问题