![](/img/trans.png)
[英]Swift , Share Extension : NSItemProvider loadItem not working
[英]Handle NSItemProvider data types in Share Extension (Swift)
我在Swift (3) 中的共享扩展编程有问题。
我的主要问题是处理NSItemProvider的data
类型。
问题是:根据我从中启动扩展程序的应用程序,我会获得不同类型的数据。 例如:
我告诉应用程序:
let IMAGE_TYPE = kUTTypeImage as String
if attachment.hasItemConformingToTypeIdentifier(IMAGE_TYPE){
attachment.loadItem(forTypeIdentifier: IMAGE_TYPE, options: nil){ data, error in
...
}
(注意:附件是NSItemProvider类型)
当从照片应用程序执行时, data
是一个 URL,所以我从中创建了一个 UIImage 并继续。
问题是,对于某些应用程序, data
已经是 UIImage 了,我找不到如何区分大小写。
最好的办法可能是检查data
对象的数据类型,但至少对我来说这不是微不足道的。
在此先感谢您的帮助!
据我测试,在某些情况下,您将在data
有一个Data
。 因此,如果您不想为此方法编写 Objective-C 包装器,则可能需要编写如下内容:
if attachment.hasItemConformingToTypeIdentifier(IMAGE_TYPE) {
attachment.loadItem(forTypeIdentifier: IMAGE_TYPE, options: nil) { data, error in
let myImage: UIImage?
switch data {
case let image as UIImage:
myImage = image
case let data as Data:
myImage = UIImage(data: data)
case let url as URL:
myImage = UIImage(contentsOfFile: url.path)
default:
//There may be other cases...
print("Unexpected data:", type(of: data))
myImage = nil
}
//...
}
}
(未测试,您可能需要修复某些部分。)
在Objective-C,你可以传递一个Objective-C块回吐(UIImage *item, NSError *error)
的completionHandler
的loadItemForTypeIdentifier:options:completionHandler:
在这种情况下,项目提供者会尝试将所有类型的图像数据转换为UIImage
。
NSItemProviderCompletionHandler
讨论
...
物品
要加载的项目。 指定块时,将此参数的类型设置为所需的特定数据类型。 ... 项目提供程序尝试将数据强制转换为您指定的类。
所以,如果你不介意写一些 Objective-C 包装器,你可以这样写:
NSItemProvider+Swift.h:
@import UIKit;
typedef void (^NSItemProviderCompletionHandlerForImage)(UIImage *image, NSError *error);
@interface NSItemProvider(Swift)
- (void)loadImageForTypeIdentifier:(NSString *)typeIdentifier
options:(NSDictionary *)options
completionHandler:(NSItemProviderCompletionHandlerForImage)completionHandler;
@end
NSItemProvider+Swift.m:
#import "NSItemProvider+Swift.h"
@implementation NSItemProvider(Swift)
- (void)loadImageForTypeIdentifier:(NSString *)typeIdentifier
options:(NSDictionary *)options
completionHandler:(NSItemProviderCompletionHandlerForImage)completionHandler {
[self loadItemForTypeIdentifier:typeIdentifier
options:options
completionHandler:completionHandler];
}
@end
{YourProject}-Bridging-Header.h:
#import "NSItemProvider+Swift.h"
并从 Swift 使用它作为:
if attachment.hasItemConformingToTypeIdentifier(IMAGE_TYPE) {
attachment.loadImage(forTypeIdentifier: IMAGE_TYPE, options: nil) { myImage, error in
//...
}
}
在我看来,Apple 应该提供NSItemProvider
这种类型安全扩展,您可以使用 Apple 的Bug Reporter编写功能请求。
示例中使用了一个新的 API,canLoadObject 和 loadObject
if (itemProvider.canLoadObject(ofClass: UIImage.self)) {
itemProvider.loadObject(ofClass: UIImage.self, completionHandler: {
(data, error) in
print("==== adding image \(image) as note, error=\(error)")
})
https://developer.apple.com/documentation/uikit/drag_and_drop/data_delivery_with_drag_and_drop
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.