2012-04-24 18 views
1

私はこの解決不可能な問題に直面しており、喜んでそれを手助けします。ZBarReaderViewController、ビューコントローラの階層など

私は、ZBarバーコードスキャナを使用するiphoneアプリを持っています。私は、UButtonを押すとZBarスキャナを呼び出すメインのViewControllerを持っています。スキャナが起動してバーコード番号を検出すると、バーコード番号が消滅し、スキャンの結果を示す結果ビューコントローラが呼び出されます。私の問題は、結果のviewcontrollerを却下することです。何らかの理由で、私はそれを消して、メインビューコントローラにきれいに戻ってきます。私の回避策は、メインビューコントローラの新しいオブジェクトを作成し、それを呼び出すことでした。これは本当に悪いデザインです。

ここに私のコードです - 何か助けてくれてありがとう!メインのViewController(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内のスキャナのデリゲートメソッド:ここ

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

With:

[self presentModalViewController:resultsViewController animated:YES]; 

私はそうしても何も起こりません。私は、メインビューコントローラに戻ってこれを行うのViewController結果の中から、

:代わりに、ちょうどこのの

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

、仕事はdoesntの:忍耐のため

[self dismissModalViewControllerAnimated:YES]; 

感謝を!

答えて

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を呼び出すために、私はあなたの[ピッカーdismissModalViewControllerAnimated:YES]後に通知を掲示することをお勧めすることができます。アプリケーションで

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

: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]; 
} 

あなたのAppDelegate例えばへ希望を助ける:)

+0

私のデリゲートメソッド - (void)imagePickerController:(UIImagePickerController *)picker didFinish PickingMediaWithInfo:(NSDictionary *)infoが呼び出されていません。どんな助け? – Nil