From dee3e26c337d30b42228d4b881bddb3e6853bbcc Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Wed, 25 Mar 2026 16:09:06 +0800 Subject: [PATCH] fix binding --- punchnet/Core/VPNManager.swift | 2 +- punchnet/Views/AppContext.swift | 5 +++++ punchnet/Views/Network/NetworkView.swift | 18 +++++++++++++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/punchnet/Core/VPNManager.swift b/punchnet/Core/VPNManager.swift index 720646e..d809c76 100644 --- a/punchnet/Core/VPNManager.swift +++ b/punchnet/Core/VPNManager.swift @@ -18,8 +18,8 @@ class VPNManager { private var manager: NETunnelProviderManager? private var statusObserver: NSObjectProtocol? - var isConnected: Bool = false var vpnStatus: VPNStatus = .disconnected + var isConnected: Bool = false var vpnStatusStream: AsyncStream private var vpnStatusCont: AsyncStream.Continuation diff --git a/punchnet/Views/AppContext.swift b/punchnet/Views/AppContext.swift index a9567ee..200e118 100644 --- a/punchnet/Views/AppContext.swift +++ b/punchnet/Views/AppContext.swift @@ -90,6 +90,11 @@ class AppContext { throw AppContextError.nullNetworkSession } + // 避免重复连接 + guard !vpnManager.isConnected else { + return + } + let context = try await SDLAPIClient.connectNetwork(accesToken: session.accessToken) if let options = SystemConfig.getOptions( networkId: UInt32(session.networkId), diff --git a/punchnet/Views/Network/NetworkView.swift b/punchnet/Views/Network/NetworkView.swift index 9cc082b..cf36e30 100644 --- a/punchnet/Views/Network/NetworkView.swift +++ b/punchnet/Views/Network/NetworkView.swift @@ -105,6 +105,21 @@ struct NetworkStatusBar: View { @State private var vpnManger = VPNManager.shared var body: some View { + let isOnBinding = Binding( + get: { vpnManger.isConnected }, + set: { newValue in + if newValue { + Task { + try? await self.appContext.connectNetwork() + } + } else { + Task { + try? await self.appContext.disconnectNetwork() + } + } + } + ) + HStack(spacing: 12) { // 左侧:状态指示器与文字 HStack(spacing: 20) { @@ -133,12 +148,13 @@ struct NetworkStatusBar: View { // 右侧:Switch 开关 // 注意:这里使用 Binding 手动接管连接/断开逻辑 - Toggle("", isOn: $vpnManger.isConnected) + Toggle("", isOn: isOnBinding) .toggleStyle(.switch) .controlSize(.small) // macOS 顶部栏或面板推荐使用 small 尺寸 } .padding(.vertical, 5) } + } struct NetworkConnectedView: View {