HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 在Share Extension(Swift)中处理NSItemProvider数据类型大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我在 Swift(3)中遇到Share Extension编程问题.
我的主要问题是处理NSItemProvider的数据类型.
这是问题所在:根据我启动扩展程序的应用程序,我得到了不同类型的数据.例如:
我告诉申请:
let IMAGE_TYPE = kUTTypeImage as String
if attachment.hasItemConformingToTypEIDentifier(IMAGE_TYPE){
     attachment.loadItem(forTypEIDentifier: IMAGE_TYPE,options: nil){ data,error in
     ...
}

(注意:附件的类型为NSItemProvider)
从照片应用程序执行时,数据是一个URL,所以我从中创建一个UIImage并继续.
问题是,对于某些应用程序,数据已经是UIImage,我无法找到如何区分大小写.
最好的方法可能是检查数据对象的数据类型,但至少对我来说并不是微不足道的.

在此先感谢您的帮助!

解决方法

据我测试,在某些情况下,您将拥有数据数据.因此,如果您不想为此方法编写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)传递给loadItemForTypEIDentifier的completionHandler: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编写功能请求.

大佬总结

以上是大佬教程为你收集整理的ios – 在Share Extension(Swift)中处理NSItemProvider数据类型全部内容,希望文章能够帮你解决ios – 在Share Extension(Swift)中处理NSItemProvider数据类型所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。