SwiftUI:如何在DisconnectListener匿名类中更新@State变量?
解决方案
要让匿名类实现的DisconnectListener能更新SwiftUI的@State变量,核心是通过闭包回调把状态更新逻辑传递给匿名类,同时注意避免循环引用。
关键修改思路
- 给实现
DisconnectListener的匿名类添加闭包属性,用于触发状态更新 - 创建Listener实例时,传入捕获
weak self的更新闭包,避免循环引用 - 用
@State存储Listener实例,保证其生命周期与View匹配
修改后的完整代码
struct ContentView : View { @State var connection = false @State private var disconnectListener: DisconnectListener? var body: some View { Toggle(isOn: $connection) { Text("Connection") .frame(maxWidth: .infinity, alignment: .trailing) } .onChange(of: connection) { newValue in if newValue { // 创建带回调的匿名Listener实例 self.disconnectListener = { class Anonymous: NSObject, DisconnectListener { private let onDisconnectCallback: (() -> Void)? init(callback: (() -> Void)?) { self.onDisconnectCallback = callback super.init() } func onDisconnect() { onDisconnectCallback?() } } // 传入更新connection的闭包,捕获weak self防止内存泄漏 return Anonymous(callback: { [weak self] in self?.connection = false }) }() controller.add(disconnectListener!) } else { // 断开连接时移除并销毁Listener if let listener = disconnectListener { controller.remove(listener) disconnectListener = nil } } } } }
说明
- 匿名类通过持有闭包,将
onDisconnect事件传递给ContentView,间接实现对@State变量的修改 - 使用
[weak self]捕获View实例,避免controller持有Listener、Listener闭包持有View导致的循环引用 - 用
@State存储Listener,保证在View生命周期内实例唯一,同时能在断开连接时安全清理
内容的提问来源于stack exchange,提问作者H1Gdev
相关产品推荐
相关产品推荐

