使用 SwiftUI,我们在 List 中安装了一个 Button。为啥当我点击按钮显示模态然后再次关闭时模态消失?

Posted

技术标签:

【中文标题】使用 SwiftUI,我们在 List 中安装了一个 Button。为啥当我点击按钮显示模态然后再次关闭时模态消失?【英文标题】:Using SwiftUI, we installed a Button in the List. Why does the modal disappear when I tap the button to display the modal and then close it again?使用 SwiftUI,我们在 List 中安装了一个 Button。为什么当我点击按钮显示模态然后再次关闭时模态消失? 【发布时间】:2019-09-25 03:21:42 【问题描述】:

我现在正在学习使用 Xcode11 的官方版本为 SwiftUI 创建示例代码。 我写了一个简单的代码来显示和隐藏模态。 此代码将一个按钮添加到列表并显示一个模式。 然而奇怪的是,关闭后再次点击按钮时,模式不再出现。

是否有这样做的原因或任何解决方案?

当列表中有按钮时发生,但如果你只从代码中删除列表,那么modal可以显示任意多次。

这是导致错误的代码。

struct ContentView: View 
  @State var show_modal = false
  var body: some View 
    List 
      Button(action: 
        print("Button Pushed")
        self.show_modal = true
      ) 
        Text("Show Modal")
      .sheet(isPresented: self.$show_modal, onDismiss: 
        print("dismiss")
      ) 
        ModalView()
      
    
  

这是一个不会导致错误的代码。

struct ContentView: View 
  @State var show_modal = false
  var body: some View 
      Button(action: 
        print("Button Pushed")
        self.show_modal = true
      ) 
        Text("Show Modal")
      .sheet(isPresented: self.$show_modal, onDismiss: 
        print("dismiss")
      ) 
        ModalView()
      
  

唯一的区别是有没有List。

模态视图代码如下。

struct ModalView: View 
    // 1. Add the environment variable
    @Environment(\.presentationMode) var presentationMode

    var body: some View 
        // 2. Embed Text in a VStack
        VStack 
            // 3. Add a button with the following action
            Button(action: 
                print("dismisses form")
                self.presentationMode.wrappedValue.dismiss()
            ) 
                Text("Dismiss")
            .padding(.bottom, 50)
            Text("This is a modal")
        
    

设置断点的时候,每次都会调用print("Button Pushed"),但是.sheet的ModalView没有被调用,自然ModalView类的body也没有被调用。

【问题讨论】:

我的回答有帮助吗? 您的建议解决了问题。这是一个非常大的帮助。 【参考方案1】:

我认为问题在于您的.sheet 不在List 本身上,而是在导致错误的代码中的Button 上。

试试这个:

struct ContentView: View 
    @State var show_modal = false
    var body: some View 
        List 
            Button(action: 
                print("Button Pushed")
                self.show_modal = true
            ) 
                Text("Show Modal")
            
        .sheet(isPresented: self.$show_modal, onDismiss: 
            print("dismiss")
        ) 
            ModalView()
        
    

【讨论】:

我选择了最佳答案。非常感谢。

以上是关于使用 SwiftUI,我们在 List 中安装了一个 Button。为啥当我点击按钮显示模态然后再次关闭时模态消失?的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何知道是不是已经使用 adb 在 android 设备中安装了任何应用程序?

SwiftUI隐藏List分隔符的不同方法

SwiftUI隐藏List分隔符的不同方法

在沙箱中安装了 parsec,但在 ghci 中尝试加载文件时找不到库

如果在 Internet Explorer 中安装了 Lync 插件,我如何检查 Javascript?

我在虚拟驱动器中安装了 XAMPP,现在我无法运行它的服务。为啥?