UICloudSharingController 在 Xcode 11 中显示无限活动指标

Ara*_*ash 6 controller sharing cloudkit ios13 swiftui

我有以下代码将 UICloudSharingController 导入 swift UI,但是当第一次集成时,它只显示一个永不停止的活动指示器,然后第二次显示它(通过 .sheet),没有活动指示器。第一次我可以看到带有活动指示器的右上角的关闭按钮。对于任何反馈,我们都表示感谢。

struct CloudSharingController: UIViewControllerRepresentable {
    typealias UIViewControllerType = UICloudSharingController

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator: NSObject, UICloudSharingControllerDelegate {
        func cloudSharingController(_ csc: UICloudSharingController, failedToSaveShareWithError error: Error) {
            print("asdf")

        }

        func itemTitle(for csc: UICloudSharingController) -> String? {
            return "item title for sharing TTT"
        }

        var parent: CloudSharingController

        init(_ cloudSharingController: CloudSharingController) {
            self.parent = cloudSharingController
        }
    }


    var share: CKShare? = nil
    var container: CKContainer = CKContainer.default()

    var firsTimeBlock: ((UICloudSharingController, @escaping (CKShare?, CKContainer?, Error?) -> Void) -> Void)? = nil

    func makeUIViewController(context: UIViewControllerRepresentableContext<CloudSharingController>) -> CloudSharingController.UIViewControllerType {

        let result: UICloudSharingController!
        if let validFirstBlock = firsTimeBlock {
            return UICloudSharingController(preparationHandler: validFirstBlock)
        } else if let validShare = self.share {
            return UICloudSharingController(share: validShare,
                                            container: container)
        } else {
            fatalError()
        }
        result.availablePermissions = [.allowReadWrite]
//        result.popoverPresentationController?.sourceView = AccountsView
        result.delegate = context.coordinator

        return result
    }

    func updateUIViewController(_ uiViewController: CloudSharingController.UIViewControllerType, context: UIViewControllerRepresentableContext<CloudSharingController>) {

    }
}
Run Code Online (Sandbox Code Playgroud)

Ara*_*ash 5

我找到了一个解决方法,可以在这里找到:

https://gist.github.com/arashkashi/bcffde1e35c7e406de52d9dff0127d41

简而言之,该解决方案包括一个视图控制器包装器,其中包含一个UICloudSharingController作为子视图控制器的实例。

UICloudSharingController有两个初始化的,一个是没有的CKShare,另一个是你已经CKShare推送到 CloudKit 的。我观察到前一个初始化程序给出了一个永无止境的活动指示器。所以我所做的是手动推送没有参与者的共享,然后将空共享提供给第二个初始化的UICloudSharingController.

这就是包装控制器应该有这一行的原因:

var share: CKShare? = nil
Run Code Online (Sandbox Code Playgroud)