我有一个带有4个按钮的UIViewController *vc1
。每个按钮都会导致推送到另一个UIViewController *vc2
。 vc2
根据按下的按钮显示一些信息。我将信息从vc1
传递到vc2
的{{1}} vc1
(它只是一个int值)。一切正常。现在我需要这样做,以便如果iphone同时位于prepareForSegue
(vc2
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
答案 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];
});