SwiftUI 教程 PresentationButton Bug

SwiftUI Tutorial PresentationButton Bug

我开始试验新的 SwiftUI 框架,该框架在 WWDC 2019 上宣布,并在 https://developer.apple.com/tutorials/swiftui 上开始教程。

现在我要通过 PresentationButton 将配置文件连接到主屏幕。更准确地说,我在 Home.swift 中谈论这部分代码:

            .navigationBarItems(trailing:
                PresentationButton(
                    Image(systemName: "person.crop.circle")
                        .imageScale(.large)
                        .accessibility(label: Text("User Profile"))
                        .padding(),
                    destination: ProfileHost()
                )
            )

当我第一次点击按钮时,配置文件 Sheet 显示得很好,但是当我关闭它然后再次点击按钮时,没有任何反应。

有人知道为什么会这样吗?

提前致谢

这看起来像是 SwiftUI 中的一个错误。 这可能与从未调用 onDisappear 这一事实有关。 您可以通过添加

来验证
.onAppear{
  print("Profile appeared")
}.onDisappear{
  print("Profile disappeared")
}

ProfileHost视图。 appear 应该由 disappear 来平衡以完成解雇是有道理的。

可以通过在状态变量上实现 returns 一个 PresentationButton "depends" 的函数来解决这个问题。

@State var profilePresented: Int = 0
func profileButton(_ profilePresented: Int) -> some View {
  return PresentationButton(
    Image(systemName: "person.crop.circle")
      .imageScale(.large)
      .accessibility(label: Text("User Profile"))
      .padding(),
    destination: ProfileHost(),
    onTrigger: {
      let deadlineTime = DispatchTime.now() + .seconds(2)
      DispatchQueue.main.asyncAfter(deadline: deadlineTime, execute: {
        self.profilePresented += 1
      })
  })
}

并替换

.navigationBarItems(trailing:
      PresentationButton(
          Image(systemName: "person.crop.circle")
              .imageScale(.large)
              .accessibility(label: Text("User Profile"))
              .padding(),
          destination: ProfileHost()
      )
  )

.navigationBarItems(trailing: self.profileButton(self.profilePresented))

我强烈建议不要使用此 "solution" 并将错误报告给 Apple。

解决这个问题最简单的方法是保留 destination: 参数,将 Image 对象放在花括号中:

PresentationButton(destination: ProfileHost()) {
    Image(systemName: "person.crop.circle")
        .imageScale(.large)
        .accessibility(label: Text("User Profile"))
        .padding()
}

这是 Xcode 11 Beta2 中解决的错误:https://developer.apple.com/documentation/xcode_release_notes/xcode_11_beta_2_release_notes

使用更新后的 API 以下内容应该可以工作:

PresentationButton(destination:ProfileHost()) {
    Image(systemName: "person.crop.circle")
    .imageScale(.large)
    .accessibility(label: Text("User Profile"))
    .padding()
}

这已在 Beta 3 中修复。我也遇到了同样的问题,PresentationButton(现在是 PresentationLink)在嵌入 .navigationBarItems 时仅触发一次。