![](/img/trans.png)
[英]Swift , Share Extension : NSItemProvider loadItem not working
[英]Handle NSItemProvider data types in Share Extension (Swift)
我在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類型)
當從照片應用程序執行時, 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)
的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
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.