我目前正在构建一个接受URL的共享扩展.作为其中的一部分,我已经按照上一个问题中的概述定制了我的共享屏幕,以创建全屏视图控制器.这一切都很好.但是在默认共享编辑器视图中,我注意到有一个网页的预览图像.我试图在我的扩展程序中访问它,但我似乎无法掌握它.
具体来说,我一直在尝试使用该方法
loadPreviewImage
https://developer.apple.com/reference/foundation/nsitemprovider/1403925-loadpreviewimage
您将在文档中注明,这表示完成处理程序的以下内容
completionHandler
A completion handler block to execute with the results. The first parameter of this block must be a parameter of type NSData, NSURL, UIImage (in iOS), or NSImage (in macOS) for receiving the image data. For more information about implementing the block, see CompletionHandler.
但是,如果我尝试在完成块中将其设置为UIImage,则会出现错误
Cannot convert value of type ‘(UIImage, _) -> ()’ to expected argument
type ‘NSItemProvider.CompletionHandler!’
示例代码,其中itemProvider通过保护语句被确认为NSItemProvider的实例
itemProvider.loadPreviewImage(options: nil) { (image: UIImage, error) in
}
完成处理程序的文档说,将其设置为您想要的类型,它将尝试将数据强制转换为您指定的类型.谁看过这个吗?我不知道该怎么做,因为我看不出我做错了什么.
https://developer.apple.com/reference/foundation/nsitemprovider/completionhandler
如果所有其他方法都失败了,我会看一下使用一些Javascript从dom获取图像,但我会喜欢Apple似乎提供的预览图像
最佳答案 我不知道为什么代码在
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)")
}
}
}
})
}