SwiftUI 和 UICloudSharingController 互相讨厌

2023-11-22

我有一个使用 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

The Plea

有什么办法可以使用吗UICloudSharingController在 SwiftUI 中?没有时间在 UIKit 或自定义共享控制器中重建项目(我知道——处于前沿的代价

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SwiftUI 和 UICloudSharingController 互相讨厌 的相关文章

随机推荐

  • statx 需要哪些功能才能停止提供 EPERM

    我有一个 Qt 项目 它使用一个插件接口 可以在我的系统上正常编译 然而 当在 docker 内编译同一个项目时 它停止使用 Qt 5 10 1 并给出消息Error Undefined interface 经过一些straceing th
  • 版本冲突更新到8.4.0

    Error 任务 app processDebugGoogleServices 执行失败 请 通过更新版本来解决版本冲突 google services 插件 最新版本信息为可以在这里找到 或将 com google android gms
  • Python 输入永远不等于整数[重复]

    这个问题在这里已经有答案了 我想插入一个数字 如果我输入 4 以外的任何数字 它会告诉我这是错误的 但如果它是假的 它会告诉我 gg 你赢了 菜鸟 但是当我插入 4 时 它告诉我这是不正确的 x input Insert a numer w
  • C# 中对 GRPC 的 TLS 支持

    我对 C 相当陌生 我需要使用基于 TLS 的 GRPC 作为一次演练 我正在修改中提供的示例主要 grpc 仓库使用 TLS 为此 我发现了另一个问题 似乎是一个很好的答案 如何为 gRPC 启用服务器端 SSL 但是 我收到错误Unha
  • 如何在现有的 momentjs 对象中获取没有时间的日期?

    假设我有如下的 momentjs 对象 var date moment new Date 2014 2 17 9 60 我怎样才能在没有时间的情况下克隆并获取新的 momentjs 对象 对于 moment 1 7 及以上版本 只需使用 s
  • MySql 一般错误:2053

    我收到错误 错误 SQLSTATE HY000 一般错误 2053 我不知道为什么会发生这种情况 因为代码工作正常并且数据库已更新 但它仍然返回此错误 这是我的代码
  • Angular Material - mat-table 不渲染来自rest api 的数据

    我一直在努力实施this来自 Angular Material 的表格示例 没有运气 我不明白我做错了什么 我的 REST 端点提供的数据在控制台输出上清晰可见 我的怀疑是 当呈现表格时 数据可能还没有完全加载 任何帮助表示赞赏 谢谢 la
  • Rails ActiveRecord 按日期查找/搜索

    我试图按 created at 日期查找记录 数据库列类型为 datetime 并且 我正在使用 jQuery 的 UI DatePicker 我的网址如下所示 localhost 3000 users supported selected
  • 当前上下文中不存在 Server.MapPath

    我有一个 C 模型类 我正在尝试访问 cshtml页面应该是电子邮件格式模板 我正在使用以下代码 string body string Empty using StreamReader reader new StreamReader Ser
  • 为什么 Web 服务返回数据为 msg.d

    我发现我的网络方法返回的数据为 d id 1 itemtxt Masters id 2 itemtxt Transactions id 3 itemtxt Misch Reports 如果您注意到 该数组被命名为 d 这是为什么 有什么规定
  • pyenv:构建失败(Fedora 34 使用 python-build 20180424)

    我需要帮助通过 pyenv 安装 python pyenv v pyenv 1 2 27 我尝试安装3 6 8版本 pyenv install 3 6 8 我收到错误 正在下载 Python 3 6 8 tar xz gt https ww
  • 在匿名函数中测试 JavaScript 函数

    是否可以测试myInnerFunction below var val function var myInnerfunction function input return input I ADDED THIS return myInner
  • PHP:7 PDO fetch(All) 尝试将类型转换为关联类型

    今天我发现我们的代码似乎与 PDO 的更改向后不兼容 在 PHP PDOStatement通过其职能fetch and fetchAll返回其值为字符串或 null 的行 我们的代码依赖于这个属性 不久前我们更新到了 PHP 7 事实证明
  • 从 C# 中的行中提取 GUID

    我尝试使用 IndexOf 来简化一些遗留代码 以从行中检索 GUID 我可以进一步简化下面的代码以摆脱使用 guids Any 和 guids First 吗 Code using regular expression private s
  • 使用 + 和 - 符号格式化数字

    我在堆栈面板中有一些 WPF 文本块 我想要对其进行数据绑定和格式化 例如 以下格式为不带秒部分的日期 24 小时格式
  • 是否有任何指定数字功能的特征?

    我想使用一个特征来绑定一个通用类型 就像这个假设的HasSQRT fn some generic function
  • 我应该对 POST 数据进行 URL 编码吗?

    我正在将数据发布到外部 API 使用 PHP 如果相关的话 我应该对传递的 POST 变量进行 URL 编码吗 或者我只需要对 GET 数据进行 URL 编码 更新 这是我的 PHP 以防相关 fields array mediauploa
  • 与 Typescript Readonly 类型不一致

    我遇到了与 Typescript 不一致的问题Readonly我不明白 Typescript v3 9 2 playground here interface Thing name string interface Obj arr Thin
  • MySQL 全文搜索和 SOUNDEX

    我正在尝试使用全文搜索和 SOUNDEX 来实现名字和姓氏搜索 以防名字拼写错误 我试图做类似的事情 SELECT FROM employees WHERE MATCH SOUNDEX first name last name AGAINS
  • SwiftUI 和 UICloudSharingController 互相讨厌

    我有一个使用 SwiftUI 的项目 需要 CloudKit 共享 但我无法获取UICloudSharingController在 SwiftUI 环境中发挥出色 第一个问题 一个简单的包装UICloudSharingController
Powered by Hwhale