uni*_*b0y 10 uiimage nsdata ios swift
我在Swift(3)中遇到Share Extension编程问题.
我的主要问题是处理NSItemProvider的类型.
这是问题所在:根据我启动扩展程序的应用程序,我得到了不同类型的数据.例如:
我告诉应用程序:data
let IMAGE_TYPE = kUTTypeImage as String
if attachment.hasItemConformingToTypeIdentifier(IMAGE_TYPE){
attachment.loadItem(forTypeIdentifier: IMAGE_TYPE, options: nil){ data, error in
...
}
Run Code Online (Sandbox Code Playgroud)
(注意:附件的类型为NSItemProvider)
当从照片应用程序执行时,data是一个URL,所以我从中创建一个UIImage并继续.
问题是,对于某些应用程序data已经是UIImage,我无法找到如何区分大小写.
最好的可能是检查data对象的数据类型,但至少对我来说并不是微不足道的.
在此先感谢您的帮助!
OOP*_*Per 15
虽然我测试至今,在某些情况下,你将有一个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
}
//...
}
}
Run Code Online (Sandbox Code Playgroud)
(未经测试,您可能需要修复某些部件.)
在Objective-C,你可以传递一个Objective-C块取(UIImage *item, NSError *error)到completionHandler的loadItemForTypeIdentifier: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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
{YourProject} -Bridging-Header.h:
#import "NSItemProvider+Swift.h"
Run Code Online (Sandbox Code Playgroud)
并使用Swift作为:
if attachment.hasItemConformingToTypeIdentifier(IMAGE_TYPE) {
attachment.loadImage(forTypeIdentifier: IMAGE_TYPE, options: nil) { myImage, error in
//...
}
}
Run Code Online (Sandbox Code Playgroud)
在我看来,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)")
})
Run Code Online (Sandbox Code Playgroud)
https://developer.apple.com/documentation/uikit/drag_and_drop/data_delivery_with_drag_and_drop