繁体   English   中英

SwiftUI:导航栏中的按钮在模式解除后不会触发

[英]SwiftUI: Button in NavigationBar won't fire after modal dismissal

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

我在 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 的样子。 请注意导航栏按钮。

在此处输入图像描述

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

在此处输入图像描述

上下拖动列表后,UI 调试器会显示与第一个图像相同的视图层次结构。

有谁知道这里发生了什么?

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM