首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在UIDocument中动态创建UIActivityItemProvider

在UIDocument中动态创建UIActivityItemProvider
EN

Stack Overflow用户
提问于 2019-04-15 21:42:52
回答 1查看 321关注 0票数 1

我使用核心数据来存储我的用户的数据。我想在UI中提供一个共享按钮来导出任何他们想要的数据。我做了一个符合UIActivityItemSource的类。如果它只是从activityViewController:itemForActivityType返回一个数据对象,但是文件有一个系统提供的文件名,那么它是成功的。因此,现在我正在尝试动态生成一个UIDocument,将其保存到文件系统中,并将URL (UIDocument.fileURL)返回给activity控制器。问题是UIDocument.save是异步的,但是在保存文件之前我不能从activityViewController:itemForActivityType返回。我的最新代码如下所示:

全班同学说:

代码语言:javascript
复制
let saveQueue = DispatchQueue(label: "saveQueue")
let saveSemaphore = DispatchSemaphore(value: 0)

..。

代码语言:javascript
复制
func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
    var success = false
    self.saveQueue.async {
        self.document.save(to: self.document.fileURL,
                           for: .forOverwriting) {(didSucceed) in
            success = didSucceed
            self.saveSemaphore.signal()
        }
    }
    saveSemaphore.wait()
    return success ? document.fileURL : nil
}

行为是异步代码启动,但保存的完成函数永远不会被调用。我做错了什么?

我的最后一个解决方案,根据凯西的帮助,是推翻UIDocument.save

代码语言:javascript
复制
override func save(to url: URL, for saveOperation: UIDocument.SaveOperation, completionHandler: ((Bool) -> Void)? = nil) {
    do {
        let contents = try self.contents(forType: GlobalConst.exportType) as! Data
        try contents.write(to: url, options: [.atomicWrite])
        completionHandler?(true)
    } catch {
        print("write error: \(error)")
        completionHandler?(false)
    }
}

我还没有理解为什么超类保存是一个问题,但我可以让它溜走。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-15 23:23:33

为了使它正常工作,我必须创建UIDocument的子类并重写func save(to:for:completionHandler:)

代码语言:javascript
复制
class MyDocument: UIDocument {

    var body: String = "Hello world, this is example content!"

    override func save(to url: URL, for saveOperation: UIDocument.SaveOperation, completionHandler: ((Bool) -> Void)? = nil) {
        do {
            try self.body.write(toFile: url.path, atomically: true, encoding: .utf8)
            completionHandler?(true)
        } catch {
            print("write error: \(error)")
            completionHandler?(false)
        }
    }
}

您的代码保持不变,只需确保self.document的类型为MyDocument (或任何您可能已经拥有的子类)。

代码语言:javascript
复制
let document = MyDocument(fileURL: URL(fileURLWithPath: NSHomeDirectory() + "/Documents/output.txt"))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55697625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档