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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 20:05:32