swift - 共享扩展将选定的文本传递给 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()
}
解决方案
attachment.loadItem(forTypeIdentifier:方法似乎是异步的 - 所以它的主体 (completionHandler) 不是直接在调用时执行的,而是在一段时间后,当项目将被加载时。在这种情况下print(self.selectedText)打印已经存在的文本。但是第二次打印同步执行,在这个确切的时间点,该值仍然为空 - loadItem 尚未执行。
因此,当您执行此代码时 - 您得到了它的工作,它的步骤类似于:
- 启动 shareSetup
- 开始执行for循环
- 开始 attachment.loadItem(forTypeIdentifier 调用
- 完成循环
- print(self.selectedText) 什么都没有
- 加载项目并执行其主体时调用completionHandler
- print(self.selectedText) 已经有东西的地方
更多地寻找异步调用和完成处理程序的使用。
推荐阅读
- javascript - 如何使用 .forEach 正确访问数组中的对象?
- openshift - 我无法再访问 OpenShift Online Starter 控制台
- exception - Cassandra3:线程异常[ReadRepairStage,操作超时-仅收到0个响应
- bash - 计算字符串中子字符串出现的次数
- alexa - Alexa Skill - 如何获取要求 Alexa 的完整陈述文本
- xamarin.forms - 制作“吐司”
- php - 加载不同的blade.php后无法读取Auth::user()
- .htaccess - htaccess 以 root 身份重写子目录,如果直接访问子目录,也会重定向
- android - Cloud Firestore:FAILED_PRECONDITION:查询需要索引
- python-3.x - Scrapy:在带有断点的调试模式下正常工作,而在没有断点的情况下不能正常工作