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 时仅触发一次。
我开始试验新的 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 时仅触发一次。