簡體   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