繁体   English   中英

在 Share Extension (Swift) 中处理 NSItemProvider 数据类型

[英]Handle NSItemProvider data types in Share Extension (Swift)

我在Swift (3) 中的共享扩展编程有问题。
我的主要问题是处理NSItemProviderdata类型。
问题是:根据我从中启动扩展程序的应用程序,我会获得不同类型的数据。 例如:
我告诉应用程序:

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)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编写功能请求。

示例中使用了一个新的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM