1

我试图获取扫描的 QR 码以显示视图控制器,其中包含有关代码所代表的项目的信息。当我尝试使用详细视图控制器时,它会出现:

Warning: Attempt to present <MachinesDetailViewController: 0x1e5bfc50> on <UITabBarController: 0x1f867d90> whose view is not in the window hierarchy!

MainViewController 带有一个主标签栏控制器,但详细视图控制器位于带有标签栏控制器的导航控制器中。

这是我的 MainViewController.m 所在的位置。

    //
//  FirstViewController.m
//  Fitness Plus+
//
//  Created by Tom Brereton on 26/01/13.
//  Copyright (c) 2013 Tom Brereton. All rights reserved.
//

#import "MainViewController.h"
#import "MachinesDetailViewController.h"
@interface MainViewController ()

@end

@implementation MainViewController

@synthesize resultText, machineKeys, codeInt, machineArea, machineName;

- (IBAction)scanButton:(id)sender {

    NSLog(@"ehe");
    // ADD: present a barcode reader that scans from the camera feed
    ZBarReaderViewController *reader = [[ZBarReaderViewController alloc] init];
    reader.readerDelegate = self;
    reader.supportedOrientationsMask = ZBarOrientationMaskAll;

    ZBarImageScanner *scanner = reader.scanner;
    // TODO: (optional) additional reader configuration here

    // EXAMPLE: disable rarely used I2/5 to improve performance
    [scanner setSymbology: ZBAR_I25
                   config: ZBAR_CFG_ENABLE
                       to: 0];
    NSLog(@"Got here");
    // present and release the controller

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


}

- (void) imagePickerController: (UIImagePickerController*) reader
 didFinishPickingMediaWithInfo: (NSDictionary*) info
{
    // ADD: get the decode results
    id<NSFastEnumeration> results =
    [info objectForKey: ZBarReaderControllerResults];
    ZBarSymbol *symbol = nil;
    for(symbol in results)
        // EXAMPLE: just grab the first barcode
        break;
    NSLog(@"Naht Here");

    // EXAMPLE: do something useful with the barcode data

    // Scan the machines.plist array and print it to the console.
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"machines" ofType:@"plist"];
    NSDictionary *machineDict = [NSDictionary dictionaryWithContentsOfFile:filePath];
    machineKeys = [machineDict objectForKey:@"Exercises"];
    machineArea = [machineDict objectForKey:@"Area"];
    resultText.text = symbol.data;

    //Convert code into integer value and put it inside codeInt
    codeInt = [symbol.data intValue];

    NSLog(@"Scanned Value: %@", [machineKeys objectAtIndex:codeInt]);
    // EXAMPLE: do something useful with the barcode image
    [self performSegueWithIdentifier:@"showDetailFromMain" sender:reader];
    // ADD: dismiss the controller (NB dismiss from the *reader*!)
    [self dismissViewControllerAnimated:YES completion:nil];


}


- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)reader {
    if ([[segue identifier] isEqualToString:@"showDetailFromMain"]) {
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
        MachinesDetailViewController *machineViewController = [storyboard instantiateViewControllerWithIdentifier:@"showMachineDetailViewController"];

        machineViewController = [segue destinationViewController];


        machineName = [machineKeys objectAtIndex:codeInt];
        [machineViewController setMachineNameLabel: machineName];
         }
}

- (void) viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}



@end

ZBar 的东西只是与 QR 扫描 API 有关。

这是 MachineDetailsViewController.m。

//
//  MachinesDetailViewController.m
//  Fitness Plus+
//
//  Created by Tom Brereton on 27/01/13.
//  Copyright (c) 2013 Tom Brereton. All rights reserved.
//

#import "MachinesDetailViewController.h"
@interface MachinesDetailViewController ()
@property(nonatomic, copy) NSString *title;
@end

@implementation MachinesDetailViewController
@synthesize machineLabel, machineName, instructionsLabel, typeLabel, mainMuscleLabel, otherMuscleLabel, equipmentLabel, machineDictionary, machineArray, mainMuscleLabelString, instructionLabelString, typeLabelString, otherMuscleLabelString, equipmentLabelString, title, machineNameLabel;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    // Set the Label text with the selected machine name
    machineName = machineNameLabel;
    mainMuscleLabel.text = mainMuscleLabelString;
    otherMuscleLabel.text = otherMuscleLabelString;
    equipmentLabel.text = equipmentLabelString;
    typeLabel.text = typeLabelString;
    instructionsLabel.text = instructionLabelString;
    self.navigationItem.title = machineName;
    NSLog(@"got it");

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

谢谢,如果您需要更多信息,请询问。

  • 汤姆
4

1 回答 1

1

在同样的问题上苦苦挣扎,我的解决方案是这样调用 segue:

 [reader dismissViewControllerAnimated:YES completion:^{
    NSLog(@"Perform segue");
    [self performSegueWithIdentifier:@"showDetailFromMain" sender:self];
}];

我还必须将 segue 连接到视图而不是单个按钮。

希望这对你有用。

于 2013-03-17T10:36:28.773 回答