SwiftUI教程PresentationButton Bug

时间:2019-06-10 09:50:12

标签: swift xcode swiftui

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

现在我到了通过services.AddMvc(options => options.EnableEndpointRouting = false)将配置文件连接到主屏幕的地步。更确切地说,我在PresentationButton中谈论这段代码:

Home.swift

当我第一次单击该按钮时,“个人资料表”看起来很好,但是当我关闭它,然后再次单击该按钮时,什么也没有发生。

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

预先感谢

4 个答案:

答案 0 :(得分:8)

它看起来像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。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:-2)

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