watchOS中SwiftUI的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
相关产品推荐
相关产品推荐

