- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在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
...
}
(注意:附件是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/
我使用多个imageView的“拖动”和“粘贴”功能到同一应用程序中的多个imageView。由于函数“drag”可以知道 imageView 的原点,函数“drop”是否可以知道“drag”末尾的
我有带 Safari 扩展的应用程序。它使用文件作为来源: NSItemProvider *attachment = [[NSItemProvider alloc] initWithContentsO
让我们分部分来吧! 我正在尝试在我的 UICollectionViewController 中实现拖放。 UICollectionView 的数据源是我创建的自定义 Model Struct 的数组。
我如何将 Swift 中的以下内容渲染到 Objective-C 中? let vCardActivity = NSItemProvider(item: vCardData, typeIdentifi
我是 iOS 11 拖放功能的新手。我知道如何在可以接受该类型对象的 View 中放置特定类型的对象。但是,在调用 loadObject(ofClass:completionHandler:) 之前,
我正在编写一个共享扩展程序,它将接受图像并对其执行一些操作。在我的 UIViewController 子类的方法中,我可以通过编写以下代码访问文件的特定表示形式的 URL: guard let con
我有一个共享扩展,允许用户将图片添加到应用程序, 一切正常,但 NSItemProvider .loadItem 不工作 这是我在 SLComposeServiceViewController 中的代
如何从 NSItemProvider 文件中获取图像?当我使用 -loadItemForTypeIdentifier:kUTTypeImage 时,我得到一个如下所示的 NSURL file:///v
在我开发的其中一个应用程序中,我使用共享扩展来导入钱包通行证 (PKPass)。 在 iOS 13(包括最新的 beta 8)上,当从 iOS Mail 应用程序中调用共享扩展时,该扩展没有接收到预期
我正在创建一个 Finder Share 扩展,以便在选择文件时使用。我想显示您正在共享的文件的图像预览(例如,您在消息和 Twitter Finder 共享扩展中看到的)。 在我的共享扩展的 Vie
我一整天都在与这个问题作斗争,正如你所看到的,我是 Swift 的新手。 我正在尝试更新 iOS 操作扩展中的 UITextField。正确的值记录在下面,并且在 loadItem() 之外可以设置正
我正在构建适用于 iOS 的共享扩展,并且愿意接受 Passbook 通行证。我有共享扩展在其中工作: NSItemProvider *itemProvider = inputItem.attachm
我有一个支持图像的共享扩展。一切正常,我从项目提供者那里得到图像,如下所示: if([imageItemProvider hasItemConformingToTypeIdentifier:(NSSt
我在Swift (3) 中遇到Share Extension 编程问题。 我的主要问题是处理NSItemProvider 的data 类型。 问题在于:根据我从中启动扩展程序的应用程序,我会得到不同类
注意:我对 Swift 编程非常陌生(仅 2 天),我正在处理这段代码作为一个ElectronJS项目。所以请不要介意我对语言基础知识的无知。谢谢。 我创建了一个包含Share App Extensi
我是一名优秀的程序员,十分优秀!