SwiftUI教程中的PresentationButton Bug。

5

我开始尝试使用在WWDC 2019上宣布的新的SwiftUI框架,并开始了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()
                )
            )

当我第一次点击按钮时,“个人资料表”显示得很好,但是当我关闭它,然后再次点击按钮时,什么也不会发生。
有人知道为什么吗?
提前感谢。
4个回答

8

看起来是SwiftUI的一个bug。 可能与onDisappear从未被调用有关。 您可以通过添加以下内容进行验证

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

转到ProfileHost视图。为了使取消操作完整,应该通过disappear平衡appear

可以通过实现一个依赖于状态变量的函数来解决这个问题,从而返回一个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))

我强烈建议不要使用这个“解决方案”,而是向苹果报告错误。


你是对的,onDisappear方法从未被调用。我认为这将是错误的根本原因。已经报告了这个bug,感谢您的建议。 - grahan
是的。我可以确认这是SwiftUI的一个bug,我们应该联系苹果公司处理这个问题。希望它能在下一个beta版本中修复。 - Phong

0
最简单的解决此问题的方法是让目标参数保持原状,在花括号内放置图像对象:。
PresentationButton(destination: ProfileHost()) {
    Image(systemName: "person.crop.circle")
        .imageScale(.large)
        .accessibility(label: Text("User Profile"))
        .padding()
}

这是我正在使用的代码,但这个按钮仍然只能触发一次。我认为这是等待beta3版本情况的问题。PresentationButton(destination: MessageListView().environmentObject(userData)) { Image(systemName: "list.bullet") } - TonyM

0

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


2
我正在使用Beta 3,但这对我仍然无效。能否分享您的解决方案? - Aᴄʜᴇʀᴏɴғᴀɪʟ

-2

使用Xcode 11 Beta2,我仍然遇到相同的问题:即按钮第一次会显示个人资料表单,但再次点击时不会触发。我检查了发布说明,没有找到与“PresentationButton”相关的任何内容(实际上没有提到)。对我来说似乎需要等待beta 3... - TonyM
2
这段代码给了我不同类型的错误,它显示“在调用中缺少参数#1,请插入'<#Label#>,'”。如果我给它一个标签,它可以工作,但它会显示标签文本而不是人物小部件。有人有解决办法吗? - Md Shafiul Islam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接