首页 > 解决方案 > 共享扩展将选定的文本传递给 textview

问题描述

我正在创建一个 iOS 共享扩展,但遇到了问题。该函数shareSetup检查附件是否为文本类型。正如您在下面的代码中看到的,selectedText被赋值但随后被清除。注意:selectedText将被设置为 textview 值。

    var selectedText = ""

    func shareSetup() {
        let extensionItem = extensionContext?.inputItems[0] as! NSExtensionItem
        let contentTypeText = kUTTypeText as String
    
        for attachment in extensionItem.attachments! {
           if attachment.hasItemConformingToTypeIdentifier(contentTypeText){
               attachment.loadItem(forTypeIdentifier: contentTypeText, options: nil,completionHandler: { (results, error) in
                   let text = results as! String
    
                    self.selectedText = text
                    print(self.selectedText) //prints correct value text
                   _ = self.isContentValid()
               })
           }
        }
        print(self.selectedText)// prints nothing
    }

    override func viewDidLoad() {
        shareSetup()
   }

标签: swiftshare-extension

解决方案


attachment.loadItem(forTypeIdentifier:方法似乎是异步的 - 所以它的主体 (completionHandler) 不是直接在调用时执行的,而是在一段时间后,当项目将被加载时。在这种情况下print(self.selectedText)打印已经存在的文本。但是第二次打印同步执行,在这个确切的时间点,该值仍然为空 - loadItem 尚未执行。

因此,当您执行此代码时 - 您得到了它的工作,它的步骤类似于:

  • 启动 shareSetup
  • 开始执行for循环
  • 开始 attachment.loadItem(forTypeIdentifier 调用
  • 完成循环
  • print(self.selectedText) 什么都没有
  • 加载项目并执行其主体时调用completionHandler
  • print(self.selectedText) 已经有东西的地方

更多地寻找异步调用和完成处理程序的使用。


推荐阅读