SwiftUI:模式关闭后导航栏中的按钮不会触发

Posted

技术标签:

【中文标题】SwiftUI:模式关闭后导航栏中的按钮不会触发【英文标题】:SwiftUI: Button in NavigationBar won't fire after modal dismissal 【发布时间】:2019-11-18 08:07:20 【问题描述】:

我遇到了一些奇怪的行为,试图让一个简单的模式在它被解除后弹出。

我在 NavigationBar 中有一个 Add 按钮,它会弹出一个模式。模态有一个可以关闭它的按钮,它可以工作。但是,在与屏幕上的其他内容交互之前,我无法再次与 NavigationBar 中的添加按钮交互,例如滚动下面的列表。

我还在列表本身中放置了另一个添加按钮,只是为了好玩。

这是主视图的代码:

import SwiftUI

struct ContentView: View 
  @State var displayModal: Bool = false

  var body: some View 
    NavigationView 
      List 
        Text("Hello again.")
          Button(action:  self.displayModal = true ) 
            Text("Add")
          
      
      .sheet(isPresented: $displayModal) 
        Modal(isPresented: self.$displayModal)
      
      .navigationBarTitle("The Title")
      .navigationBarItems(trailing: Button(action:  self.displayModal = true ) 
        Text("Add")
      )
    
  

为了完整起见,模态:

import SwiftUI

struct Modal: View 
  @Binding var isPresented: Bool

  var body: some View 
    VStack 
      HStack 
        Button(action: 
          self.isPresented = false
        ) 
          Text("Cancel")
        
        .padding()
        Spacer()
      
      Text("I am the modal")
      Spacer()
    
  

我唯一能想到的是,一些不可见的东西阻止了我使用 NavigationBar 按钮。所以我启动了 UI 调试器,这就是 ContentView 的样子。注意 NavigationBar 按钮。

现在,当我点击按钮并显示模式后,然后使用 UI Debugger 再次查看 ContentView,所有相同的元素都在原位,但 Button 父视图偏移了一点,如下所示:

当我上下拖动 List 时,UI 调试器会显示与第一张图像相同的视图层次结构。

有人知道这里发生了什么吗?

我在 iPhone 11 Pro 模拟器上使用 Xcode 11.2.1 和 ios 13,但在我的 iPhone 上也观察到了这一点。

谢谢!

【问题讨论】:

这里相同 - 我建议在雷达中打开一个错误.... 【参考方案1】:

这确实是一个错误。有趣的是,在“拖动关闭”之后没有观察到问题,所以这是一种“同步/异步”状态变化之类的。

解决方法(当然是暂时的,几乎完全降低可见度)

  .navigationBarItems(trailing: Button(action:  self.displayModal = true ) 
    Text("Add").padding([.leading, .vertical], 4)
  )

【讨论】:

【参考方案2】:

我遇到了同样的问题,对我来说,解决方法是在演示者上使用内联样式的导航栏标题。

.navigationBarTitle(Text("The Title"), displayMode: .inline)

但是,如果您在 ContentView 上使用自定义强调色(如 .accentColor(Color.green)),则此解决方法不再有效。

编辑:该错误似乎已在 13.4 中修复,不再需要解决方法。

【讨论】:

以上是关于SwiftUI:模式关闭后导航栏中的按钮不会触发的主要内容,如果未能解决你的问题,请参考以下文章

导航栏中的 SwiftUI 元素不响应状态

SwiftUI 模式表在关闭后重新打开

如何在 SwiftUI 中创建共享导航栏以在多个视图之间进行交互? [关闭]

向下滚动后无法访问导航栏中的菜单按钮

导航按钮无法关闭模式

如何使用 SwiftUI 显示全栈模式?