我在中的共享扩展编程中遇到问题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)
从Photos App执行时,data是一个URL,因此我从该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中,您可以将采用(UIImage *item, NSError *error)的Objective-C块传递给completionHandlerloadItemForTypeIdentifier: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编写功能请求。

关于ios - 在Share Extension(Swift)中处理NSItemProvider数据类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42590986/

10-09 10:21