首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在共享扩展(Swift)中处理NSItemProvider数据类型

在共享扩展(Swift)中处理NSItemProvider数据类型
EN

Stack Overflow用户
提问于 2017-03-04 01:19:19
回答 2查看 8.4K关注 0票数 14

我对共享扩展编程在Swift (3)中有一个问题。

我的主要问题是如何处理data类型的NSItemProvider。

问题是:根据我启动扩展的应用程序,我得到了不同类型的数据。例如:

我告诉申请:

代码语言:javascript
复制
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对象的数据类型,但至少对我来说并不简单。

提前感谢您的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-04 02:41:46

就我测试的情况而言,在某些情况下,您将在data中拥有一个data。因此,如果不想为该方法编写Objective包装器,则可能需要编写类似的内容:

代码语言:javascript
复制
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:

代码语言:javascript
复制
@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:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#import "NSItemProvider+Swift.h"

并在Swift中使用它:

代码语言:javascript
复制
    if attachment.hasItemConformingToTypeIdentifier(IMAGE_TYPE) {
        attachment.loadImage(forTypeIdentifier: IMAGE_TYPE, options: nil) { myImage, error in
            //...
        }
    }

在我看来,苹果应该提供这种类型安全的NSItemProvider扩展,你可以用苹果的臭虫报告员编写一个功能请求。

票数 18
EN

Stack Overflow用户

发布于 2020-02-21 07:15:55

在示例中使用了一个新的API,canLoadObject和loadObject

代码语言:javascript
复制
if (itemProvider.canLoadObject(ofClass: UIImage.self)) {
            itemProvider.loadObject(ofClass: UIImage.self, completionHandler: {
                (data, error) in
                print("==== adding image \(image) as note, error=\(error)")
})

丢弃

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42590986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档