У меня странная проблема, я пытаюсь создать расширение действия, которое будет сканировать штрих-код с предоставленного изображения. Вот код.
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
}
}
}
Теперь, когда я пытаюсь получить UIImage, я всегда получаю nil, тогда как на изображении я вижу, что изображение получено. Но когда я пытаюсь получить UIImage из этого изображения, он всегда возвращает ноль. Вот снимок экрана отладки, который может помочь
Обновление: вот описание изображения, полученного как:
Вывод описания изображения: (NSSecureCoding!) image = (instance_type = Builtin.RawPointer = 0x15d674c0 -> 0x32b6be5c (void *)0x32b6be70: NSURL)
Я создал такое же расширение, используя цель C, и оно работает, но не быстро. Вот объективный код 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;
}
}
}
Я пытался много искать в Google, но ничего не нашел. Я даже пробовал измененный код, но он не работает, вот измененный код:
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)
}
}
})
Обновление: я заметил одну вещь; если я создаю новый проект и добавляю к нему расширение действия, автоматически генерируется тот же код, за исключением нескольких строк, которые я добавил в блок. В этом случае даже без изменения одной строки автоматически сгенерированного кода imageView.image равен нулю. Это ошибка в Swift?? Или какая-то ошибка с моим приложением Xcode.