正确的方法来放松HomeViewController?不平衡的错误

时间:2014-05-25 16:45:32

标签: ios uinavigationcontroller segue uistoryboardsegue

我有一个应用程序,我一直在努力处理明显不好的教程,并在之前的一个帖子上撕下了一个新的,所以有点担心再次发布。对不起,我一直都会这样做。

无论如何我的登录,注册和其他功能都完美无缺。我正忙着使用AVFoundation进行条形码扫描。我设置我的流程

Barcode Scan Flow http://demo.leaguelaunch.com/barcode-flow.png

按钮单击HomeViewController,在扫描后将其推送到BarcodeViewController,推送到ScanResultsViewController。

ScanResultsViewController将发送JSON帖子数据并呈现响应,但由于我得到的错误,我还没有任何内容。我在这里所有的是这个代码直接放松到HomeViewController,而不是必须回推(BarcodeView)然后返回(HomeView)

- (void)viewDidLoad
{
    [super viewDidLoad];
    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(back)];
    self.navigationItem.hidesBackButton = YES;
    self.navigationItem.leftBarButtonItem = item;
    NSLog(@"Made it to Success!!!");
}

-(void)back{
    [self performSegueWithIdentifier:@"unwindToHomeResult" sender:self];
}

正如你所看到它会起作用,但它可以工作一次,或者在我收到错误之前可以工作10次。

2014-05-25 12:11:32.378 selfcheckin[3344:60b] QR Code = {"stop_id":"3","event_id":"1"}
2014-05-25 12:11:32.801 selfcheckin[3344:60b] StopReading Called
2014-05-25 12:11:32.812 selfcheckin[3344:60b] Made it to Success!!!
2014-05-25 12:11:42.615 selfcheckin[3344:60b] QR Code = {"stop_id":"3","event_id":"1"}
2014-05-25 12:11:43.322 selfcheckin[3344:60b] StopReading Called
2014-05-25 12:11:43.334 selfcheckin[3344:60b] Made it to Success!!!
2014-05-25 12:11:50.850 selfcheckin[3344:60b] QR Code = {"stop_id":"3","event_id":"1"}
2014-05-25 12:11:51.296 selfcheckin[3344:60b] StopReading Called
2014-05-25 12:11:51.308 selfcheckin[3344:60b] Made it to Success!!!
2014-05-25 12:11:51.349 selfcheckin[3344:60b] QR Code = {"stop_id":"3","event_id":"1"}
2014-05-25 12:11:51.352 selfcheckin[3344:60b] StopReading Called
2014-05-25 12:11:51.370 selfcheckin[3344:60b] nested push animation can result in corrupted navigation bar
2014-05-25 12:11:51.759 selfcheckin[3344:60b] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.
2014-05-25 12:11:51.851 selfcheckin[3344:60b] Unbalanced calls to begin/end appearance transitions for <ScanResultsViewController: 0x14e86570>.

所以我的主要问题是如何从ResultsView返回到HomeView。我试图只是修改NavigationController,看看我能否做到。关于我可能出错的地方或正确的方法的任何指示

THX

2 个答案:

答案 0 :(得分:2)

您可以使用导航控制器上的popToRootViewController返回第一个视图控制器。

[self.navigationController popToRootViewControllerAnimated:YES];

答案 1 :(得分:1)

看起来你几乎同时将两个ScanResultsViewController推到导航堆栈上,这会破坏导航栏并导致展开细分中断。

我敢打赌,之所以发生这种情况,是因为您的BarcodeViewController正在扫描条形码/ QR码,但一旦找到,就不会停止扫描。确保在成功找到条形码时停止扫描条形码(或至少设置一个标记)以确保只按一个ScanResultsViewController

当我在我的某个应用程序中实施QR码扫描程序时,我遇到了同样的问题。如果找到条形码/ QR码,我将调用以下方法(我使用的是ZXingObjC,只是FYI);您可能在BarcodeViewController中使用了类似的方法:

- (void)captureResult:(ZXCapture *)capture result:(ZXResult *)result
{
    if (result) {
        [self performSegueWithIdentifier:@"ScanResults"];
    }
}

这里的问题是,在执行segue的调用之后,甚至都可以再次调用此方法,这意味着我有时会执行两次segue。为了阻止这种情况,我通过简单地记住我已经找到了类似这样的条形码来有效地阻止了这一点:

- (void)captureResult:(ZXCapture *)capture result:(ZXResult *)result
{
    if (result && !self.foundBarcode) {
        self.foundBarcode = YES;
        [self performSegueWithIdentifier:@"ScanResults"];
    }
}

...阻止了segue执行两次。我想你的情景可能非常相似。