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

8

我有以下代码来将UICloudSharingController导入SwiftUI,但当第一次集成时它只显示一个永远不停止的活动指示器,然后第二次(通过.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>) {

    }
}

在Beta 5中也遇到了同样的问题。你有任何进展吗? - Alex
2
有两件事情,第一是在控制器中使用初始化程序,当已经存在共享记录时。另一个初始化程序用于没有共享记录的情况,但目前存在问题。第二个是将控制器包装成一个可表示的视图控制器,并将共享控制器添加为子控制器。 - Congruent Tech. UG
2个回答

6

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

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

简要地说,解决方案包括一个视图控制器包装器,其中包含一个 UICloudSharingController 实例作为子视图控制器。

UICloudSharingController 有两种初始化方式,一种是没有 CKShare 时的初始化,另一种是当你已经将 CKShare 推送到 CloudKit 时的初始化。我观察到前者的初始化会导致不断旋转的活动指示器。所以我手动推送了一个没有参与者的分享,然后将空的分享提供给了 UICloudSharingController 的第二个初始化。

这就是为什么包装器控制器应该有这一行代码的原因:

var share: CKShare? = nil

目前,我的解决方法只是将其显示在根窗口上,但现在这可能会更好一些。 - plivesey
请查看上面的Gist链接。 - Congruent Tech. UG

0

现在有一个使用UICloudSharingController新的苹果演示项目。

如果没有共享记录,则使用preparationHandler初始化UICloudSharingController

private func newSharingController(unsharedPhoto: Photo, persistenceController: PersistenceController) -> UICloudSharingController {
    return UICloudSharingController { (_, completion: @escaping (CKShare?, CKContainer?, Error?) -> Void) in
        self.persistentContainer.share([unsharedPhoto], to: nil) { objectIDs, share, container, error in
            if let share = share {
                self.configure(share: share)
            }
            completion(share, container, error)
        }
    }
}  

其中 persistenceController 位于

class PersistenceController: NSObject, ObservableObject {
// …
}  

UICloudSharingController 是使用的。

func presentCloudSharingController(photo: Photo) {
    /**
     Grab the share if the photo is already shared.
     */
    var photoShare: CKShare?
    if let shareSet = try? persistentContainer.fetchShares(matching: [photo.objectID]),
       let (_, share) = shareSet.first {
        photoShare = share
    }

    let sharingController: UICloudSharingController
    if photoShare == nil {
        sharingController = newSharingController(unsharedPhoto: photo, persistenceController: self)
    } else {
        sharingController = UICloudSharingController(share: photoShare!, container: cloudKitContainer)
    }
    sharingController.delegate = self
    /**
     Setting the presentation style to .formSheet so there's no need to specify sourceView, sourceItem, or sourceRect.
     */
    if let viewController = rootViewController {
        sharingController.modalPresentationStyle = .formSheet
        viewController.present(sharingController, animated: true)
    }
}  

这段代码的最后几行表明控制器并非使用SwiftUI,而是UIKit。

显然,目前无法在SwiftUI中使用preparationHandler初始化UICloudSharingController


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