【问题标题】:ZBarReaderViewController, view controllers hierarchy and othersZBarReaderViewController,视图控制器层次结构和其他
【发布时间】:2012-04-24 00:30:33
【问题描述】:

我正面临这个无法解决的问题,很高兴得到您的帮助。

我有一个使用 ZBar 条形码扫描仪的 iphone 应用程序。我有一个主视图控制器,它在按下 UIButton 时调用 ZBar 扫描仪。一旦扫描仪启动并检测到条形码编号,它就会自行关闭,我调用结果视图控制器来显示一些扫描结果。我的问题是关闭结果视图控制器 - 由于某种原因,我无法关闭它并以干净的方式返回主视图控制器。我的工作是创建一个主视图控制器的新对象并调用它,这是一个非常糟糕的设计。

这是我的代码 - 感谢您的帮助!

在主视图控制器的某处调用扫描仪(UIButton 操作方法):

ZBarReaderViewController *reader = [ZBarReaderViewController new];
UINavigationController *navCntrl1 = [[UINavigationController alloc] initWithRootViewController:reader];
reader.readerDelegate = self;
reader.title = @"Scan Barcode";
reader.supportedOrientationsMask = ZBarOrientationMaskAll;
ZBarImageScanner *scanner1 = reader.scanner;
[scanner1 setSymbology: ZBAR_I25 config: ZBAR_CFG_ENABLE to: 0];
[scanner1 setSymbology: ZBAR_QRCODE config: ZBAR_CFG_ENABLE to: 0];
[self presentModalViewController:navCntrl1 animated:YES];

主 ViewController 中的 Scanner Delegate 方法:

//ZBarSDK Finish Scanning
- (void) imagePickerController: (UIImagePickerController*) reader didFinishPickingMediaWithInfo: (NSDictionary*) info
{
  id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults];
ZBarSymbol *symbol = nil;
for(symbol in results)
    break;

// EXAMPLE: do something useful with the barcode data

[self dismissModalViewControllerAnimated: YES];

//Calling the Results view controller
Results *resultsViewController = [[Results alloc] initWithNibName:nil bundle:nil];
resultsViewController.tempBarcode = barcode;

UINavigationController *resultsNavigationController = [[UINavigationController alloc] initWithRootViewController:resultsViewController];
resultsNavigationController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;

[[[UIApplication sharedApplication]delegate].window setRootViewController:resultsNavigationController];

 }

这里说一下我尝试替换的地方:

[[[UIApplication sharedApplication]delegate].window setRootViewController:resultsNavigationController];

与:

[self presentModalViewController:resultsViewController animated:YES];

但如果我这样做,什么都不会发生。

从结果视图控制器中,我这样做是为了返回主视图控制器:

ViewController *mainViewController = [[ViewController alloc] initWithNibName:nil bundle:nil];
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:mainViewController];
mainNavigationController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;    
[self presentModalViewController:mainNavigationController animated:YES];

而不仅仅是这个,这是行不通的:

[self dismissModalViewControllerAnimated:YES];

感谢您的耐心等待!

【问题讨论】:

    标签: iphone objective-c ios uiviewcontroller barcode-scanner


    【解决方案1】:

    我有一个使用 ZBar 的类似应用。这是我对您的 UIButton 方法的模拟:

    - (void)scanButtonTapped{
        ZBarReaderViewController *reader = [ZBarReaderViewController new];
        reader.readerDelegate = self;
        reader.supportedOrientationsMask = ZBarOrientationMaskAll;
    
        ZBarImageScanner *scanner = reader.scanner;
    
        // I need to scan only QR-codes
        [scanner setSymbology:0 config:ZBAR_CFG_ENABLE to:0];
        [scanner setSymbology:ZBAR_QRCODE config:ZBAR_CFG_ENABLE to:1];
        reader.readerView.zoom = 1.0;
    
        [self presentModalViewController:reader animated:YES];
        [reader release];
    }
    

    这是我的 imagePickerController:didFinishPickingMediaWithInfo:

    - (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
        id<NSFastEnumeration> results = [info objectForKey:ZBarReaderControllerResults];
        ZBarSymbol *symbol = nil;
    
        for (symbol in results) 
            break;
    
        // Here I get the QR-code text
        self.qrText = symbol.data;
        NSLog(@"QR-code text = %@",self.qrText);
    
        // Here I hide scanning View Controller from user
        [picker dismissModalViewControllerAnimated:YES];
    
        // Here I call QR-code text processing logic
        [self ticketCheckOutLogic];
    }
    

    为了调用另一个 UIViewController,我可以建议在 [picker dismissModalViewControllerAnimated:YES]; 之后发布通知。到您的 AppDelegate 例如:

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:self.barcodeText, @"barcodeText", nil];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"newBarcodeScanned" object:nil userInfo:options];
    

    在 application:didFinishLaunchingWithOptions: 你可以这样写:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showResultView:)name:@"newBarcodeScanned" object:nil];
    

    ... 而你的 showResultView: 可以是这样的:

    - (void)showResultView:(NSNotification *)notification {
         //Calling the Results view controller
         Results *resultsViewController = [[Results alloc] initWithNibName:@"ResultsView" bundle:nil];
         NSDictionary *dict = [notification userInfo];
         resultsViewController.tempBarcode = [dict objectForKey:@"barcodeText"];
         [self presentModalViewController:resultsViewController animated:YES];
    }
    

    希望有帮助:)

    【讨论】:

    • 我的委托方法 - (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 没有被调用。有什么帮助吗?
    猜你喜欢
    • 1970-01-01
    • 2012-10-16
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    相关资源
    最近更新 更多