gpt4 book ai didi

ios - 处理 Share Extension (Swift) 中的 NSItemProvider 数据类型

转载 作者:IT王子 更新时间:2023-10-29 05:35:44 26 4
gpt4 key购买 nike

我在Swift (3) 中遇到Share Extension 编程问题。
我的主要问题是处理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 中,您可以将一个带有 (UIImage *item, NSError *error) 的 Objective-C block 传递给 loadItemForTypeIdentifier:options 的 completionHandler :完成处理程序:。在这种情况下,项目提供者会尝试将各种图像数据转换为 UIImage

NSItemProviderCompletionHandler

Discussion

...

item

The item to be loaded. When specifying your block, set the type of this parameter to the specific data type you want. ... The item provider attempts to coerce the data to the class you specify.

所以,如果你不介意写一些 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com