2014-07-22 2 views
0

Я сделал этот учебник http://rdcworld-iphone.blogspot.com.au/2013/03/how-to-use-barcode-scanner-br-and-qr-in.htmlQR и штрих-код сканер не работает Xcode 5.1

Я использую симулятор iPhone на IOS SDK 7.1, Xcode 5.1.1, Mac OSX 10.9.4 и Objective C , Что должно произойти, когда я бегу программа выглядит следующим образом:

1) Я нажимаю на кнопку сканирования на окне, которое впервые появляется

2) я получаю возможность выбора изображения для сканирования в iPhone фотоальбом

3) я выбираю QR-или штрих-код

4) Он сканирует штрих-код

5) определяет значение и отображает, что на экране вместе с небольшой версией сканированного изображения.

Что на самом деле происходит, это доходит до 4-го шага, и метод со сканированием изображения заканчивается (startScanning). Однако вместо того, чтобы делать шаг 5, он показывает огромную версию штрих-кода на экране, и метод, который префикс шага 5 никогда не называется (didFinishPickingMediaWithInfo).

Содержание ViewController.h

// 
// ViewController.h 
// BarCodeScannerDemo 
// 
// Created by RDC on 3/11/13. 
// Copyright (c) 2013 RDC World. All rights reserved. 
// 

#import <UIKit/UIKit.h> 
#import "ZBarSDK.h" 

@interface ViewController : UIViewController<ZBarReaderDelegate> 

@property (weak, nonatomic) IBOutlet UIImageView *resultImageView; 
@property (weak, nonatomic) IBOutlet UITextView *resultTextView; 
- (IBAction)startScanning:(id)sender; 

@end 

Содержание ViewController.m

// 
// ViewController.m 
// BarCodeScannerDemo 
// 
// Created by RDC on 3/11/13. 
// Copyright (c) 2013 RDC World. All rights reserved. 
// 

#import "ViewController.h" 

@interface ViewController() 
@end 

@implementation ViewController 

@synthesize resultImageView; 
@synthesize resultTextView; 

#pragma mark - ViewController's LifeCycle methods 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSLog(@"View did load"); 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    NSLog(@"Did receive memory warning"); 
} 

#pragma mark - Button click method 


- (IBAction)startScanning:(id)sender 
{ 
    NSLog(@"Scanning.."); 
    resultTextView.text = @"Scanning.."; 

    //Create a reader 
    ZBarReaderViewController *codeReader = [ZBarReaderViewController new]; 
    //Setup a delegate to recieve the results 
    //The delegate implements the ZBarReaderDelegate protocol, which inherits from UIImagePickerControllerDelegate 
    codeReader.readerDelegate= self; 

    codeReader.supportedOrientationsMask = ZBarOrientationMaskAll; 

    ZBarImageScanner *scanner = codeReader.scanner; 
    [scanner setSymbology: ZBAR_I25 config: ZBAR_CFG_ENABLE to: 0]; 

    [self presentViewController:codeReader animated:YES completion:nil]; 
    NSLog(@"End Start Scanning method"); 

} 

#pragma mark - ZBar's Delegate method 
//Called when a barcode is successsfully decoded 
//reader is the reader controller instance that read the barcodes 
- (void) imagePickerController: (UIImagePickerController*) reader didFinishPickingMediaWithInfo: (NSDictionary*) info 
{ 
    NSLog(@"Decode results..."); 


    // get the decode results 
    id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults]; 

    ZBarSymbol *symbol = nil; 
    for(symbol in results) 
     break;// just grab the first barcode 

    // showing the result on textview 
    resultTextView.text = symbol.data; 

    resultImageView.image = [info objectForKey: UIImagePickerControllerOriginalImage]; 

    // dismiss the controller 
    [reader dismissViewControllerAnimated:YES completion:nil]; 
} 


-(void) readerControllerDidFailToRead:(ZBarReaderController *)reader withRetry:(BOOL)retry 
{ 
    NSLog(@"readerControllerDidFailToRead"); 
    //If retry parameter is NO controller must be dismissed. 
    if(retry==NO) 
     reader=nil; 
} 

@end 

Содержание AppDelegate.h

// 
// AppDelegate.h 
// BarCodeScannerDemo 
// 
// Created by RDC on 3/11/13. 
// Copyright (c) 2013 RDC World. All rights reserved. 
// 

#import <UIKit/UIKit.h> 

@class ViewController; 

@interface AppDelegate : UIResponder <UIApplicationDelegate> 

@property (strong, nonatomic) UIWindow *window; 

@property (strong, nonatomic) ViewController *viewController; 

@end 

Содержание AppDelegate.m

// 
// AppDelegate.m 
// BarcodeScannerDemo 
// 
// Created by Airefrig Australia on 18/07/2014. 
// Copyright (c) 2014 RDCWorld. All rights reserved. 
// 

#import "AppDelegate.h" 
#import "ViewController.h" 

@implementation AppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 
    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

- (void)applicationWillResignActive:(UIApplication *)application 
{ 
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 
} 

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 
} 

- (void)applicationWillTerminate:(UIApplication *)application 
{ 
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 
} 

@end 

Я потратил много часов, пытаясь найти решение этого, и я не нашел ничего, что обеспечило решение. Единственный человек, с которым я столкнулся, имеет такую ​​же проблему, как и моя, находится в разделе комментариев к учебным страницам, но они так и не получили ответа.

Пожалуйста, помогите!

Редактировать:

Изображение, которое отображается поворачивается на 90 градусов. Также я новичок в объекте c, поэтому, если вы предоставляете код, объясните, почему разница должна вступить в силу. Я хочу, чтобы улучшить свои знания =)

Edit: Решение

Поскольку я не могу ответить на мой собственный вопрос менее 8 часов после того, как спрашивать, вот что я нашел:

При чтении ZBarSDK API ссылка на ZBarReaderViewController здесь: http://zbar.sourceforge.net/iphone/sdkdoc/ZBarReaderViewController.html

В нем говорится: «Это контроллер, который можно использовать для прямого сканирования с помощью камеры с автоматическим захватом. Для сканирования файлов изображений или с помощью ручного захвата см. ZBarReaderController».

Это означает, что установка объекта ZBarReaderViewController в методе startScanning не является тем, что должно быть там. Ну, не для сканирования статического изображения.Мне придется проверить исходный код на самом устройстве, а не на Mac, но похоже, что ZBarReaderController - это то, что я действительно хочу.

Новый метод startScanning теперь выглядит следующим образом:

- (IBAction)startScanning:(id)sender 
{ 
    resultTextView.text = @"Scanning.."; 

    //Create a reader 
    ZBarReaderViewController *codeReader = [ZBarReaderController new]; 
    //Setup a delegate to recieve the results 
    //The delegate implements the ZBarReaderDelegate protocol, which inherits from UIImagePickerControllerDelegate 
    codeReader.readerDelegate= self; 

    [codeReader.scanner setSymbology: ZBAR_I25 config: ZBAR_CFG_ENABLE to: 0]; 

    [self presentViewController:codeReader animated:YES completion:nil]; 

} 

При проверке я заметил, что изображения с прозрачным фоном (например, QR-код и изображения штрих-кода, размещенную на сайте учебник) не работает - вы Я получу сообщение, в котором не будет найден код. Вы должны сохранить их как файл jpg с белым фоном.

Я не знаю, должно ли быть сделано что-то еще, поскольку я только переименовал объект и удалил несколько строк кода, которые дали ошибки, - но программа действительно работает так, как я ожидаю в данный момент. Если у меня возникнут какие-либо проблемы, я отправлю новый вопрос.

ответ

0

Попробуйте этот код.

ZBarReaderViewController *codeReader = [ZBarReaderViewController new]; 
codeReader.readerDelegate= self; 
codeReader.supportedOrientationsMask = ZBarOrientationMaskAll; 
[codeReader.scanner setSymbology:ZBAR_I25 config:ZBAR_CFG_ENABLE to:0]; 
[codeReader.readerView start]; 

[self presentViewController:codeReader animated:YES completion:nil]; 

Ниже необязателен =)

[codeReader.readerView setZoom:2]; 
codeReader.view.frame = self.view.bounds; 
+0

Спасибо за быстрый ответ! =) Я заменил содержимое startScanning на этот код, а затем попытался использовать код опции (вставленный непосредственно перед строкой presentViewController), но, похоже, имеет такую ​​же проблему. Я должен добавить, что отображаемое изображение поворачивается на 90 градусов, а также покрывает экран. Также я новичок в объективе c, поэтому не уверен, что эффект замены объекта сканера только с помощью codeReader.scanner. Я буду обновлять исходное сообщение, чтобы отразить все это. – SOair

+0

Вы уверены, что '- (void) imagePickerController: (UIImagePickerController *) читатель didFinishPickingMediaWithInfo: (NSDictionary *) info' никогда не вызывается? У вас есть строка кода 'resultImageView.image = [info objectForKey: UIImagePickerControllerOriginalImage];' в ней. Я предполагаю, что это делает изображение штрих-кода на вашем экране. – Ryan

+0

Я говорю, что он не вызывается, потому что я помещаю в NSlog-инструкции и они не отображаются в журнале сообщений. Это может быть и моя нехватка знаний. Есть ли альтернативный метод отображения сообщений/сообщений об ошибках/исключений? – SOair