共享扩展传递选定文本到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()
}

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

所以当你执行这段代码时-你让它工作了它的步骤类似于这样:

  • 开始shareSetup
  • 开始执行for循环
  • 开始依恋。loadItem (forTypeIdentifier调用
  • 完成循环
  • print(self.selectedText) where is nothing
  • 在加载项目并执行其主体时调用completionHandler
  • 打印(self.selectedText)如果它已经有了

查看更多异步调用和完成处理程序的使用。

相关内容

  • 没有找到相关文章

最新更新