2

我有一个UIViewController *vc1有 4 个按钮的。每个按钮都会导致一个 push segue 到另一个UIViewController *vc2vc2是根据按下的按钮显示一些信息。我将信息从传递vc1vc2in vc1prepareForSegue它只是一个 int 值)。这一切都很好。现在我需要这样做,以便如果 iphone 同时打开(isVisible )并且 a接收到 a (蓝牙设备发生某些事情),vc2也将调用它。这是我的代码:vc1vc1vc1UINotification

-(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];
}
4

1 回答 1

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];
});
于 2013-06-19T22:59:14.770 回答