2013-10-22 66 views
2

我遇到严重的问题让我的导航控制器工作,并尝试几乎所有相关的问题在这个网站上。UINavigationController'损坏的导航栏'问题

我的问题是,当我以编程方式执行segue时,导航栏中似乎存在转换,但视图不会更改。我看到下面的错误,而不是:

2013-10-22 13:47:30.059 App[2236:a0b] nested push animation can result in corrupted navigation bar 
2013-10-22 13:47:30.411 App[2236:a0b] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted. 
2013-10-22 13:47:30.501 App[2236:a0b] Unbalanced calls to begin/end appearance transitions for 

我的故事板是这样的:

enter image description here

在LoginViewController我们基于某些条件执行赛格瑞:

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear]; 
    NSString* appState = [AppConfig getAppState]; 
    if ([appState isEqualToString:APP_STATE_WAITING]) { 
     [self performSegueWithIdentifier:@"Load" sender:self]; 
    } 
    else if ([appState isEqualToString:APP_STATE_REGISTRATION_AVAILABLE]) { 
     [self performSegueWithIdentifier:@"SignUp" sender:self]; 
    } 
} 

在LoadingViewController我们在执行操作前等待Web服务响应:

- (void)segueToWaitingList:(NSUInteger)behind inFront:(NSUInteger)inFront 
{ 
    [MosaycOptions setAppState:APP_STATE_WAITING]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self performSegueWithIdentifier:@"Waiting" sender:self]; 
    }); 
} 

这就是让我感到棘手的问题。导航栏的转变,但认为不和我们看到打印出来以下错误:

2013-10-22 13:47:30.059 App[2236:a0b] nested push animation can result in corrupted navigation bar 
2013-10-22 13:47:30.411 App[2236:a0b] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted. 
2013-10-22 13:47:30.501 App[2236:a0b] Unbalanced calls to begin/end appearance transitions for 

的应用程序不会崩溃,但没有发生SEGUE,它不会转移到等待名单的看法,但仅仅停留在加载并打印错误到控制台。当我按回到而不是移动回登录屏幕出现以下空白屏幕:

enter image description here

如果我回来了它与此错误崩溃按:http://pastebin.com/7mCyeQv9

东西显然是越来越乱了与导航堆栈,但我已经检查它使用调试器,它看起来非常好,一切都被推到平常。我不能为我的生活弄清楚。这只是我之前使用的标准导航控制器设置。

任何想法?

+0

为什么你使用dispatch_async(dispatch_get_main_queue(),^ {“in ** viewDidAppear **?** viewDidAppear **总是在主队列中运行 – adnako

+0

好点,遗留在另一个位置。 – Michael

+0

您应该使用** viewDidAppear:(BOOL)animated **方法,而不是** viewDidAppear ** – adnako

回答

10

我终于想通了这个问题。

performSegueWithIdentifier之前调用viewDidAppear在LoadingViewController上被调用。基本同步错误。

+1

你是如何协调这一点的? –

+0

从我记得有一个竞争条件之间的网络响应踢segue和viewDidAppear方法的过渡视图被调用。我想我只有两个布尔值,一个表示已收到响应,一个表示viewDidAppear已被调用,然后用它们来决定顶部是否启用了继续。 – Michael

3

您不应该在viewDidLoad中执行segue。 尝试执行在viewDidApperar:

苹果documentation

Displaying a View Controller’s Contents Programmatically … Present it from another visible view controller. …

+1

没有帮助我害怕。 – Michael

+1

它应该工作。我有同样的问题。 – adnako

+1

我把它移到viewDidAppear中,但得到同样的问题。 – Michael