SwiftUI:'self'初始化所有存储的属性之前使用



是的,我知道以前有人问过这个问题,但接受的答案对我来说不起作用。这些答案确实修复了编译器错误,但当我从ContentView.init方法中将"self"传递给类的初始值设定项,而该类后来在ContentView上调用了一个方法时,self不是正确的实例。回调setVpnState设置@State变量的值,该变量应导致UI更新。但事实并非如此,而且在lldb中检查时,它显然不是同一个"self"(ContentView的实例(。

以下是我最初尝试做的事情:

struct ContentView: View {

let iwinsController: IWiNSController
init() {
iwinsController = IWiNSController(view: self)
}
var body: some View {
.
.
.
}

func setVpnState(_ state: ButtonState) {
self.buttonAttributes = buttonConfig[state]!
}
}

正如你所料,我得到的错误是'self' used before all stored properties are initialized

然后我尝试了这个问题的两个答案:';self';在初始化所有存储的属性之前使用

这确实满足了编译器的要求,但正如我所说,当从我的控制器对象调用setVpnState时,"self"是不正确的。

因此,我必须在不传递"self"的情况下初始化我的控制器,然后在onAppear中显式设置视图。这是有效的。但这意味着在我的控制器中,每次使用它时我都必须打开view

感觉不太快。我是斯威夫特的新手,我想以公认的方式来做这件事。

struct ContentView: View {
let iwinsController: IWiNSController
init() {
self.iwinsController = IWiNSController()
}
var body: some View {
.
.
.
}.onAppear {
iwinsController.setView(view: self)
}
}

func setVpnState(_ state: ButtonState) {
self.buttonAttributes = buttonConfig[state]!
}
}

如果我正确理解这个问题,听起来你希望视图跟踪视图中的某个vpnState类,并试图将引用从视图传递到控制器对象,但这与SwiftUI的设计方式相反。

从根本上讲,您应该将视图视为只读对象,这些对象由框架在后台更新。将它们锁定在要观察的特性或对象上,当该特性或对象发生更改时,视图将自动更新为新值。

@State变量旨在严格在视图中使用,例如用于完全在视图中的动画或其他中间状态。在这种情况下,要做的最快捷的事情是使用@ObservedObject@EnvironmentObject来为您观察对象的状态。

关于为什么CCD_ 8是";不同的";对象,因为struct是值类型而不是引用类型。每次更改时,Swift都会将其销毁并重新创建。它不是";更新的";在对象上的值发生变化的意义上。

最新更新