SwiftUI教程PresentationButton Bug

gra*_*han 4 xcode swift swiftui

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

现在,我谈到了通过来将Profile连接到HomeScreen的地步PresentationButton。更确切地说,我在谈论以下代码部分Home.swift

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

当我第一次单击该按钮时,“配置文件”看起来很好,但是当我关闭它,然后再次单击该按钮时,什么也没有发生。

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

提前致谢

Mar*_*cio 8

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

.onAppear{
  print("Profile appeared")
}.onDisappear{
  print("Profile disappeared")
}
Run Code Online (Sandbox Code Playgroud)

ProfileHost视图。它将使意义上的appear应由被平衡disappear的解雇是完整的。

可以通过实现一个返回PresentationButton“取决于”状态变量的a的函数来解决该问题。

@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
      })
  })
}
Run Code Online (Sandbox Code Playgroud)

并更换

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

.navigationBarItems(trailing: self.profileButton(self.profilePresented))
Run Code Online (Sandbox Code Playgroud)

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