You need to enable JavaScript to run this app. SwiftUI中KeyboardToolbar回调调用实例成员报错如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 14:54:05