我对共享扩展编程在Swift (3)中有一个问题。
我的主要问题是如何处理data类型的NSItemProvider。
问题是:根据我启动扩展的应用程序,我得到了不同类型的数据。例如:
我告诉申请:
let IMAGE_TYPE = kUTTypeImage as String
if attachment.hasItemConformingToTypeIdentifier(IMAGE_TYPE){
attachment.loadItem(forTypeIdentifier: IMAGE_TYPE, options: nil){ data, error in
...
}(注:附件为NSItemProvider型)
当从Photos执行时,data是一个UIImage,因此我从它创建一个UIImage并继续执行。
问题是,对于某些应用程序来说,data已经是一个UIImage,而我无法找到如何进行案例区分。
最好是检查data对象的数据类型,但至少对我来说并不简单。
提前感谢您的帮助!
发布于 2017-03-04 02:41:46
就我测试的情况而言,在某些情况下,您将在data中拥有一个data。因此,如果不想为该方法编写Objective包装器,则可能需要编写类似的内容:
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中,您可以将使用(UIImage *item, NSError *error)的Objective块传递给completionHandler of loadItemForTypeIdentifier:options:completionHandler:.在这种情况下,项目提供程序尝试将所有类型的图像数据转换为UIImage。
NSItemProviderCompletionHandler
讨论 ..。 项目 要加载的项目。指定块时,请将此参数的类型设置为所需的特定数据类型。..。项提供程序试图将数据强制到您指定的类中。
因此,如果您不介意编写一些Objective包装器,您可以编写如下内容:
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;
@endNSItemProvider+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}-桥接头.h:
#import "NSItemProvider+Swift.h"并在Swift中使用它:
if attachment.hasItemConformingToTypeIdentifier(IMAGE_TYPE) {
attachment.loadImage(forTypeIdentifier: IMAGE_TYPE, options: nil) { myImage, error in
//...
}
}在我看来,苹果应该提供这种类型安全的NSItemProvider扩展,你可以用苹果的臭虫报告员编写一个功能请求。
发布于 2020-02-21 07:15:55
在示例中使用了一个新的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://stackoverflow.com/questions/42590986
复制相似问题