SwiftUI中KeyboardToolbar回调调用实例成员报错如何解决
问题原因
这个报错是Swift语法层面的限制:结构体的存储属性初始化执行时,整个实例的self还未完成构造,此时无法调用属于实例的方法addText(),也无法访问其他实例属性。
解决方法
方案1:改为计算属性(推荐)
将toolbarItems从存储属性调整为计算属性,每次读取该属性时才会生成工具栏项数组,此时实例已完成初始化,可以正常调用实例方法:
import SwiftUI import KeyboardToolbar struct KeyToolbar: View { @State var text = "" func addText() { self.text = "Hello!" } // 改为计算属性,去掉原来的等号,加大括号和return var toolbarItems: [KeyboardToolbarItem] { return [ .init(systemName: "plus.circle", callback: { addText() }), .init(systemName: "italic", callback: {}), .init(systemName: "underline", callback: {}), .dismissKeyboard ] } var body: some View { TextField("Text:", text: $text) .keyboardToolbar(toolbarItems) } }
方案2:使用lazy修饰存储属性
你也可以给toolbarItems加上lazy修饰符,标记该属性只会在第一次被访问时才执行初始化,此时self已经可用:
// 仅需要修改属性定义这一行 lazy var toolbarItems: [KeyboardToolbarItem] = [ .init(systemName: "plus.circle", callback: {self.addText()}), .init(systemName: "italic", callback: {}), .init(systemName: "underline", callback: {}), .dismissKeyboard ]
注意:SwiftUI的View是值类型,lazy属性在视图重绘时可能出现异常状态,优先使用方案1更稳妥。
内容的提问来源于stack exchange,提问作者christian
相关产品推荐
相关产品推荐

