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
相关产品推荐
相关产品推荐

