我有一个使用 SwiftUI 的项目,需要 CloudKit 共享,但我无法获取UICloudSharingController
在 SwiftUI 环境中发挥出色。
第一个问题
一个简单的包装UICloudSharingController
using UIViewControllerRepresentable
产生一个无尽的旋转器(参见this)。正如对其他系统控制器所做的那样UIActivityViewController
,我包裹了UICloudSharingController
在一个含有UIViewController
像这样:
struct CloudSharingController: UIViewControllerRepresentable {
@EnvironmentObject var store: CloudStore
@Binding var isShowing: Bool
func makeUIViewController(context: Context) -> CloudControllerHost {
let host = CloudControllerHost()
host.rootRecord = store.noteRecord
host.container = store.container
return host
}
func updateUIViewController(_ host: CloudControllerHost, context: Context) {
if isShowing, host.isPresented == false {
host.share()
}
}
}
final class CloudControllerHost: UIViewController {
var rootRecord: CKRecord? = nil
var container: CKContainer = .default()
var isPresented = false
func share() {
let sharingController = shareController
isPresented = true
present(sharingController, animated: true, completion: nil)
}
lazy var shareController: UICloudSharingController = {
let controller = UICloudSharingController { [weak self] controller, completion in
guard let self = self else { return completion(nil, nil, CloudError.controllerInvalidated) }
guard let record = self.rootRecord else { return completion(nil, nil, CloudError.missingNoteRecord) }
let share = CKShare(rootRecord: record)
let operation = CKModifyRecordsOperation(recordsToSave: [record, share], recordIDsToDelete: [])
operation.modifyRecordsCompletionBlock = { saved, _, error in
if let error = error {
return completion(nil, nil, error)
}
completion(share, self.container, nil)
}
self.container.privateCloudDatabase.add(operation)
}
controller.delegate = self
controller.popoverPresentationController?.sourceView = self.view
return controller
}()
}
这允许控制器正常启动,但是......
第二个问题
点击关闭按钮或滑动以关闭,控制器将消失,但没有任何通知表明它已被关闭。 SwiftUI 视图@State
启动呈现控制器的属性仍然是true
。没有明显的方法来检测模式的解除。经过一番实验,我发现呈现的控制器是原来的UIHostingController
创建于SceneDelegate
。通过一些技巧,您可以注入一个在 a 中引用的对象UIHostingController
子类化为CloudSharingController
。这将使您检测解雇并设置@State
财产给false
。但是,所有导航栏按钮在关闭后都不再起作用,因此您只能点击此按钮一次。场景的其余部分功能齐全,但导航栏中的按钮没有响应。
第三个问题
即使你能得到UICloudSharingController
要正常呈现和关闭,点击任何共享方法(消息、邮件等)都会使控制器消失且没有动画,并且用于共享的控制器URL
没有出现。没有崩溃或控制台消息——它就消失了。
Demo
我在 GitHub 上做了一个快速而肮脏的项目来演示这个问题:云套件共享。它只是创建一个String
and a CKRecord
使用 CloudKit 来表示它。界面显示String
(a UUID
)用一个导航栏按钮来共享它:
![CloudKitSharingUI](https://i.stack.imgur.com/vbWHw.png)
The Plea
有什么办法可以使用吗UICloudSharingController
在 SwiftUI 中?没有时间在 UIKit 或自定义共享控制器中重建项目(我知道——处于前沿的代价
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)