我如何 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
            }
        }
    }
}