我有一个UIViewController *vc1
有 4 个按钮的。每个按钮都会导致一个 push segue 到另一个UIViewController *vc2
。vc2
是根据按下的按钮显示一些信息。我将信息从传递vc1
到vc2
in vc1
(prepareForSegue
它只是一个 int 值)。这一切都很好。现在我需要这样做,以便如果 iphone 同时打开(isVisible )并且 a接收到 a (蓝牙设备发生某些事情),vc2
也将调用它。这是我的代码: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];
}
现在,如果正确的事件发生vc2
加载两次,而不是一次。我在输出日志中收到这些错误消息:
“嵌套推送动画可能导致导航栏损坏”和“对 .corrupted 的开始/结束外观转换的不平衡调用。”和“在意外状态下完成导航转换。导航栏子视图树可能会损坏。
这些错误发生在我按下后退按钮后。我添加了NSLog
语句,这就是为什么我知道vc2
'sviewDidLoad
每次都会被调用两次。
我使用情节提要为所有 4 个按钮创建了 push segues。我没有给它们贴上标签。我也通过情节提要创建了事件推送 segue,并给了它 identifier "detected"
。我希望这里有人知道我做错了什么。不胜感激。谢谢。
这是当前代码:
-(void)viewDidAppear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exerciseDetected:) name:@"ExerciseDetected" object:nil];
[[NSNotifcationCenter defaultCenter] addObserver:self selector:@selector(cancelExercise:) name@"cancelExercise" object:nil];
}
-(void)exerciseDetected:(NSNotification *)notification{
if(self.isViewLoaded && self.view.window){
if(self == self.navigationController.topViewController){
if(!timerRunning){
timerRunning =YES;
_exerciseTimer = (NSTimer scheduledTimerWithTimeInterval:EXERCISE_AUTOSTART_TIME target:self selector:@selector(startExercise:) userInfo:nil repeats:NO];
}
}
}
}
-(void)cancelExercise:(id)sender{
[_exerciseTimer invalidate];
timerRunning = NO;
}
-(void) startExercise: (id)sender{
timerRunning = NO;
[self performSegueWithIdentifier:@"detected" sender:self];
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
vc2 *destination = [segue destinationViewController];
[destination setSElectedExerciseIDFromMenu:_selectedExercise];
}