【发布时间】:2020-11-14 21:36:19
【问题描述】:
是的,我知道以前有人问过这个问题,但接受的答案对我不起作用。这些答案确实修复了编译器错误,但是当我从 ContentView.init 方法中将“self”传递给类的初始化程序,并且该类稍后调用 ContentView 上的方法时,“self”不是正确的实例。回调 setVpnState 设置 @State 变量的值,这应该会导致 UI 更新。但事实并非如此,并且在 lldb 中检查时,它显然不是同一个“自我”(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' used before all stored properties are initialized
这确实满足了编译器,但正如我所说,当从我的控制器对象调用 setVpnState 时,'self' 不正确。
所以,我要做的是在不传递“self”的情况下初始化我的控制器,然后在 onAppear 中明确设置视图。这行得通。但这意味着在我的控制器中,我每次使用它时都必须打开 view。
感觉不是很“敏捷”。我是 Swift 的新手,希望以公认的方式来做这件事。
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]!
}
}
【问题讨论】:
-
将 'self' 传递给类的初始化程序 ...您从类的角度思考,但 SwiftUI 视图是 结构 - 值类型- 没有参考。这个
iwinsController.setView(view: self)只是复制了self.... 你需要改变对 SwiftUI 的看法。