我目前正在构建一个接受网址的共享扩展程序。作为其中的一部分,我已经按照上一个问题中的概述定制了我的共享屏幕,以创建全屏视图控制器。这一切都很好。但是在默认共享编辑器视图中,我注意到有一个网页的预览图像。我试图在我的扩展程序中访问它,但我似乎无法掌握它。
具体来说,我一直在尝试使用方法
loadPreviewImage
https://developer.apple.com/reference/foundation/nsitemprovider/1403925-loadpreviewimage
您将在文档中注明,这表示完成处理程序的以下内容
完成处理程序 一个完成处理程序块,用于执行结果。该块的第一个参数必须是NSData,NSURL,UIImage(在iOS中)或NSImage(在macOS中)类型的参数,用于接收图像数据。有关实现块的更多信息,请参阅完成处理程序。
但是如果我尝试在完成块中将其设置为UIImage,则会出现错误
无法转换类型的值'(UIImage,_) - > ()'到预期的论点 输入'NSItemProvider.CompletionHandler!'
示例代码,其中itemProvider通过保护语句被确认为NSItemProvider的实例
itemProvider.loadPreviewImage(options: nil) { (image: UIImage, error) in
}
完成处理程序的文档说要将其设置为您想要的类型,它将尝试将数据强制转换为您指定的类型。谁看过这个吗?我不知道该怎么做,因为我看不出我做错了什么。
https://developer.apple.com/reference/foundation/nsitemprovider/completionhandler
如果所有其他方法都失败了,我会考虑使用一些Javascript从dom中获取图像,但我会喜欢Apple似乎提供的预览图像
答案 0 :(得分:3)
我不知道为什么
中的代码itemProvider.loadPreviewImage(options: nil) { (image: UIImage, error) in
}
在点按“发布”按钮时未调用。
我的方法是在方法
中保存预览图像override func configurationItems() -> [Any]! {
}
作为
let inputItem: NSExtensionItem = self.extensionContext?.inputItems[0] as! NSExtensionItem
let itemProvider = inputItem.attachments![0] as! NSItemProvider
if (itemProvider.hasItemConformingToTypeIdentifier("public.url")) {
itemProvider.loadPreviewImage(options: nil, completionHandler: { (item, error) in // 画像を取得する
if let image = item as? UIImage {
if let data = UIImagePNGRepresentation(image) {
self.photoNSURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("preview.png") as NSURL!
do {
try data.write(to: self.photoNSURL as URL, options: .atomic)
} catch {
print("\(#file)#\(#function)(\(#line)): error: \(error.localizedDescription)")
}
}
}
})
}