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

watchOS中SwiftUI的PresentationButton使用一次后无法触发如何解决?

解决watchOS中PresentationButton返回后无法再次触发的问题

我之前也碰到过一模一样的问题!这其实是早期SwiftUI里PresentationButton的一个状态管理bug——当你点击Cancel返回父视图后,按钮内部的展示状态没有被正确重置,导致它误以为弹窗还处于显示状态,自然就不再响应后续的点击了。

可靠修复方案:改用绑定状态控制模态展示

现在更稳妥的做法是用@State变量手动控制模态视图的显示/隐藏,配合sheet(或watchOS特有的fullScreenCover,根据你需要的展示样式选择),把状态完全握在自己手里,就不会出现状态不同步的问题了。

修改后的代码示例:

struct ContentView : View {
    // 用@State变量控制模态视图的显示状态
    @State private var isPresentingModal = false
    
    var body: some View {
        ZStack {
            Button(action: {
                // 点击按钮时切换状态
                self.isPresentingModal.toggle()
            }) {
                Text("Click to show")
            }
            // 绑定状态,控制模态视图的展示
            .sheet(isPresented: $isPresentingModal) {
                SomeOtherView()
            }
            .transition(.slide)
        }
    }
}

// 子视图需要正确实现关闭逻辑
struct SomeOtherView: View {
    @Environment(\.presentationMode) var presentationMode
    
    var body: some View {
        Button("Cancel") {
            // 通过环境变量关闭模态视图,同时自动更新父视图的绑定状态
            presentationMode.wrappedValue.dismiss()
        }
    }
}

为什么原来的代码会失效?

旧的PresentationButton是自动管理内部展示状态的,但在watchOS的早期版本中存在缺陷:当我们手动调用dismiss关闭模态视图时,按钮内部的状态没有同步更新,它会一直认为弹窗还在显示,所以后续的点击就不会触发新的展示动作。

而用@State绑定的方式,关闭模态视图时isPresentingModal会被自动置为false,下次点击按钮时能正确切换状态,重新唤起子视图。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:07:44