我如何 show/hide 基于 PHPhotoLibraryAuthorizationStatus 的 SwiftUI 视图?
How do I show/hide a view with SwiftUI based on PHPhotoLibraryAuthorizationStatus?
如果用户没有授予访问照片库的权限,我正在尝试在 SwiftUI 中显示一个视图(通过提示或进入“设置”向他们提供允许访问照片库的说明并修复状态)。现在我假设 PHPhotoLibrary.authorizationStatus
是我的真实来源,但也许我还没有完全理解这个概念
var canAccessPhotos : Bool {
return PHPhotoLibrary.authorizationStatus() == .authorized
}
...
.sheet(isPresented: canAccessPhotos) { //Error: Cannot convert value of type 'Bool' to expected argument type 'Binding<Bool>'
AccessPhotoLibraryView() //New View I want to show the user with instructions or prompt
}
现在这行不通了,因为 canAccessPhotos
不可绑定,但我也不能将 @Binding 放在计算的 属性 上,目前没有机制让变量在authorizationStatus
变化,所以我在下一步如何解决它。
如何从 PHPhotoLibrary
获取 属性 以自动显示它更改的视图 if/when。还是有其他方法可以做到这一点而我走错了方向?
提前致谢
好的,你最好使用协调器(或视图模型)来解决这个问题。看看下面的代码,让我知道它是否适合你。
class Coordinator: NSObject, ObservableObject, PHPhotoLibraryChangeObserver {
@Published var isPhotoLibraryAuthorized = false
override init() {
super.init()
PHPhotoLibrary.shared().register(self)
updateStatus()
}
func photoLibraryDidChange(_ changeInstance: PHChange) {
updateStatus()
}
private func updateStatus() {
DispatchQueue.main.async {
self.isPhotoLibraryAuthorized = PHPhotoLibrary.authorizationStatus() == .authorized
}
}
}
struct ContentView: View {
@EnvironmentObject var coordinator: Coordinator
var body: some View {
Group {
if coordinator.isPhotoLibraryAuthorized {
// some view
} else {
// another view
}
}
}
}
如果用户没有授予访问照片库的权限,我正在尝试在 SwiftUI 中显示一个视图(通过提示或进入“设置”向他们提供允许访问照片库的说明并修复状态)。现在我假设 PHPhotoLibrary.authorizationStatus
是我的真实来源,但也许我还没有完全理解这个概念
var canAccessPhotos : Bool {
return PHPhotoLibrary.authorizationStatus() == .authorized
}
...
.sheet(isPresented: canAccessPhotos) { //Error: Cannot convert value of type 'Bool' to expected argument type 'Binding<Bool>'
AccessPhotoLibraryView() //New View I want to show the user with instructions or prompt
}
现在这行不通了,因为 canAccessPhotos
不可绑定,但我也不能将 @Binding 放在计算的 属性 上,目前没有机制让变量在authorizationStatus
变化,所以我在下一步如何解决它。
如何从 PHPhotoLibrary
获取 属性 以自动显示它更改的视图 if/when。还是有其他方法可以做到这一点而我走错了方向?
提前致谢
好的,你最好使用协调器(或视图模型)来解决这个问题。看看下面的代码,让我知道它是否适合你。
class Coordinator: NSObject, ObservableObject, PHPhotoLibraryChangeObserver {
@Published var isPhotoLibraryAuthorized = false
override init() {
super.init()
PHPhotoLibrary.shared().register(self)
updateStatus()
}
func photoLibraryDidChange(_ changeInstance: PHChange) {
updateStatus()
}
private func updateStatus() {
DispatchQueue.main.async {
self.isPhotoLibraryAuthorized = PHPhotoLibrary.authorizationStatus() == .authorized
}
}
}
struct ContentView: View {
@EnvironmentObject var coordinator: Coordinator
var body: some View {
Group {
if coordinator.isPhotoLibraryAuthorized {
// some view
} else {
// another view
}
}
}
}