SwiftUI:模式关闭后,NavigationBar中的按钮将不会触发

时间:2019-11-18 08:07:20

标签: ios swift swiftui

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

我在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按钮。

enter image description here

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

enter image description here

一旦我上下拖动列表,UI调试器将显示与第一个图像相同的视图层次。

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

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

谢谢!

2 个答案:

答案 0 :(得分:2)

这确实是一个错误。有趣的是,在“拖动以消除”之后未发现该问题,因此这是一种“同步/异步”状态更改或类似的情况。

解决方法(暂时的Corse,几乎完全降低了可见性)

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

答案 1 :(得分:0)

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

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

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

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