performSegueWithIdentifier和prepareForSegue

时间:2013-06-19 22:37:02

标签: xcode storyboard

我有一个带有4个按钮的UIViewController *vc1。每个按钮都会导致推送到另一个UIViewController *vc2vc2根据按下的按钮显示一些信息。我将信息从vc1传递到vc2的{​​{1}} vc1(它只是一个int值)。一切正常。现在我需要这样做,以便如果iphone同时位于prepareForSeguevc2 isVisible)并且vc1收到vc1,也会调用vc1 (蓝牙设备会发生一些事情)。这是我的代码:

UINotification

现在,如果正确的事件发生-(void) eventDetected:(NSNotification *)notification{ if(self.isViewLoaded && self.view.window){ [self performSegueWithIdentifier:@"detected" sender:self]; } } -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { VC2 *destination = [segue destinationViewController]; [destination setValue:value]; } 加载两次,而不是一次。我在输出日志中收到这些错误消息:

  

“嵌套推送动画可能导致导航栏损坏”&   “不平衡调用开始/结束外观转换为.corrupted。&”完成导航过渡   意外的状态。导航栏子视图树可能已损坏。

按下后退按钮后会发生这些错误。我添加了vc2语句,这就是为什么我知道NSLog的{​​{1}}每次被调用两次的原因。

我使用故事板为所有4个按钮创建了推送segue。我没有贴上标签。我也通过故事板创建了事件推送segue,并为其指定了标识符vc2。我希望这里有人知道我做错了什么。会很感激的建议。感谢。

以下是当前代码:

viewDidLoad

1 个答案:

答案 0 :(得分:4)

当self是顶视图控制器时,你绝对应该只调用performSegueWithIdentifier

if (self == self.navigationController.topViewController) {

    ...
}

如果您需要确定只有一次可以执行某些操作:

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    [self foo];
});

如果你需要在下一个运行循环执行中运行一些东西,你可以这样做:

dispatch_async(dispatch_get_main_queue(), ^{
    [self bar];
});