You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI:视图内按钮点击无法触发自定义类成员函数问题

问题原因
  • 你声明的stat是可选类型StatusBar?,未做初始化默认值为nil,可选链调用stat?.testing()会直接终止执行,不会触发函数调用
  • StatusBar是遵守ObservableObject协议的引用类型,@State属性包装器仅适用于修饰值类型(如结构体、基础数据类型),用来修饰引用类型无法正确持有实例
适配macOS 10.15的修复方案

macOS 10.15版本不支持@StateObject(该属性包装器从macOS 11起提供),使用@ObservedObject修饰并直接初始化实例即可,无需声明为可选类型。

修正后的视图代码如下:

struct ContentView: View {
    // 替换@State为@ObservedObject,同时初始化非可选实例
    @ObservedObject var stat = StatusBar()

    var body: some View {
        Button {
            stat.testing()
        } label: {
            Text("Testing")
        }
    }
}

如果你确实有场景需要使用可选类型的StatusBar,请确保在调用testing()方法前,已经完成实例赋值,比如可以在视图生命周期方法中初始化:

struct ContentView: View {
    @State var stat: StatusBar?

    var body: some View {
        Button {
            stat?.testing()
        } label: {
            Text("Testing")
        }
        .onAppear {
            // 视图加载时完成实例初始化
            stat = StatusBar()
        }
    }
}
补充说明

如果你的StatusBar实例需要在多个视图间共享,可以在上级视图通过.environmentObject(StatusBar())注入,当前视图用@EnvironmentObject var stat: StatusBar接收即可,无需重复初始化。

内容的提问来源于stack exchange,提问作者Eric

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:06:03