ZBarReaderViewController, view controllers hierarchy and oth



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

我有一个使用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];

主视图控制器中的扫描仪委托方法:

//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];

感谢您的耐心等待!

我有一个类似的应用程序使用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];
}

希望对:)有所帮助

最新更新