Sha*_*iel 8 objective-c ios swift ios8 ios-app-extension
我有一个奇怪的问题,我正在尝试构建一个动作扩展,它将从提供的图像中扫描条形码.这是代码.
override func viewDidLoad() {
super.viewDidLoad()
// Get the item[s] we're handling from the extension context.
// For example, look for an image and place it into an image view.
// Replace this with something appropriate for the type[s] your extension supports.
var imageFound = false
for item: AnyObject in self.extensionContext!.inputItems {
let inputItem = item as NSExtensionItem
for provider: AnyObject in inputItem.attachments! {
let itemProvider = provider as NSItemProvider
if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeImage as NSString) {
// This is an image. We'll load it, then place it in our image view.
weak var weakImageView = self.imageView
itemProvider.loadItemForTypeIdentifier(kUTTypeImage as NSString, options: nil, completionHandler: { (image, error) in
if image != nil {
dispatch_async(dispatch_get_main_queue(),{
if let imageView = weakImageView {
var imageToSet: UIImage? = image as? UIImage
imageView.image = image as? UIImage
}
self.imageToScan = self.imageView.image
self.scanFromImage(self.imageToScan!)
})
}
})
imageFound = true
break
}
}
if (imageFound) {
// We only handle one image, so stop looking for more.
break
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,每当我尝试获取UIImage时,我总是为零,而在图像中,我可以看到接收到的图像.但是当我尝试从该图像获取UIImage时,它总是返回nil.以下是可能有帮助的调试屏幕截图

更新:以下是收到的图像说明:
打印图像描述:(NSSecureCoding!)image =(instance_type = Builtin.RawPointer = 0x15d674c0 - > 0x32b6be5c(void*)0x32b6be70:NSURL)
我使用目标C创建了相同的扩展,它可以工作,但不是在swift中.这是客观的C代码:
- (void)viewDidLoad {
[super viewDidLoad];
// Get the item[s] we're handling from the extension context.
// For example, look for an image and place it into an image view.
// Replace this with something appropriate for the type[s] your extension supports.
BOOL imageFound = NO;
for (NSExtensionItem *item in self.extensionContext.inputItems) {
for (NSItemProvider *itemProvider in item.attachments) {
if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeImage]) {
// This is an image. We'll load it, then place it in our image view.
__weak UIImageView *imageView = self.imageView;
[itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeImage options:nil completionHandler:^(UIImage *image, NSError *error) {
if(image) {
dispatch_async(dispatch_get_main_queue(), ^{
[imageView setImage:image];
imageToScan = image;
[self scanImage:imageToScan];
});
}
}];
imageFound = YES;
break;
}
}
if (imageFound) {
// We only handle one image, so stop looking for more.
break;
}
}
Run Code Online (Sandbox Code Playgroud)
}
我试图在谷歌上搜索很多,但一无所获.我甚至尝试过更改过的代码但不能正常工作,这里是更改后的代码:
itemProvider.loadItemForTypeIdentifier(kUTTypeImage as NSString, options: nil, completionHandler: { (image, error) in
if image != nil {
NSOperationQueue.mainQueue().addOperationWithBlock {
if let imageView = weakImageView {
var imageToSet: UIImage? = image as? UIImage
imageView.image = image as? UIImage
}
self.imageToScan = self.imageView.image
self.scanFromImage(self.imageToScan)
}
}
})
Run Code Online (Sandbox Code Playgroud)
更新:我注意到了一件事; 如果我创建一个新项目并为其添加一个动作扩展,则会自动生成相同的代码,除了我在块中添加的几行.即使没有更改单行自动生成的代码,imageView.image也是零.这是一个快速的错误?或者我的Xcode应用程序的一些错误.
问题是图像不是UIImage,它是NSURL.
将代码更改为此代码:
imageView.image = UIImage(data: NSData(contentsOfURL: image as NSURL)!)!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2622 次 |
| 最近记录: |