SwiftUI 教程演示按钮错误



我开始尝试新的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()
                )
            )

当我第一次单击按钮时,配置文件表看起来很好,但是当我关闭它然后再次单击该按钮时,没有任何反应。

有谁知道为什么会这样?

提前致谢

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

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

ProfileHost视图。appear应该与一个disappear相平衡,以完成解雇,这是有道理的。

可以通过实现一个返回"依赖于"状态变量的PresentationButton的函数来解决它。

@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))

我强烈建议不要使用此"解决方案",而只需将错误报告给Apple。

解决此问题的最简单方法是将 destination: 参数保留为独立,并将 Image 对象放在大括号中:

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

这在 Beta 3 中得到了修复。 我也有同样的问题,PresentationButton(现在的PresentationLink(在嵌入.navigationBarItems时只触发一次。

这是

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()
}

最新更新