Xcode 使用标识符和prepareForSegue执行检查

Xcode 使用标识符和prepareForSegue执行检查,xcode,storyboard,Xcode,Storyboard,我有一个带有4个按钮的UIViewController*vc1。每个按钮都会导致到另一个UIViewController*vc2的按下顺序vc2is根据按下的按钮显示一些信息。我将信息从vc1传递到vc1的prepareforsgue中的vc2(它只是一个int值)。这一切都很好。现在我需要这样做,如果iphone同时处于vc1(vc1可见)并且vc1接收到UINotification(蓝牙设备发生了一些情况),那么vc2也会被调用。这是我的密码: -(void) eventDetected:(

我有一个带有4个按钮的
UIViewController*vc1
。每个按钮都会导致到另一个
UIViewController*vc2
的按下顺序
vc2
is根据按下的按钮显示一些信息。我将信息从
vc1
传递到
vc1
prepareforsgue
中的
vc2
(它只是一个int值)。这一切都很好。现在我需要这样做,如果iphone同时处于
vc1
vc1
可见)并且
vc1
接收到
UINotification
(蓝牙设备发生了一些情况),那么
vc2
也会被调用。这是我的密码:

-(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将加载两次,而不是一次。我在输出日志中得到这些错误消息:

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

这些错误发生在我按下后退按钮之后。我添加了
NSLog
语句,这就是为什么我知道
vc2
viewDidLoad
每次都会被调用两次

我使用故事板为所有4个按钮创建了按钮序列。我没有给它们贴标签。我还通过故事板创建了事件推送序列,并给它标识
“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];
}

当self是俯视图控制器时,您绝对应该只调用performsguewithidentifier

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

    ...
}
如果您需要确保只调用一次某个对象,请执行以下操作:

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    [self foo];
});
dispatch_async(dispatch_get_main_queue(), ^{
    [self bar];
});
如果需要在下一次运行循环执行中运行某些内容,可以执行以下操作:

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

当self是俯视图控制器时,您绝对应该只调用performsguewithidentifier

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

    ...
}
如果您需要确保只调用一次某个对象,请执行以下操作:

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    [self foo];
});
dispatch_async(dispatch_get_main_queue(), ^{
    [self bar];
});
如果需要在下一次运行循环执行中运行某些内容,可以执行以下操作:

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

我应该测试通知名吗?我以为这就是选择器的作用?如果我错了,我可以更改它。我在其他条件下添加了If(self==self.navigationInControl.topViewController)嵌套,这很有帮助。现在vc2只被调用一次。然而,当我点击导航栏后退按钮时,仍然会出现同样的错误。此外,我只是间歇性地(可能每5次一次)得到它们。发生的情况是,我按下vc2上的“后退”按钮,屏幕动画返回到vc1,但随后它似乎再次动画并出现“后退”按钮。我想我可能已经解决了第二个问题,但我不确定。我的下一步是实现一个延迟计时器。我决定做这件事,现在有5秒的延迟,它似乎在工作。嗨,Michelejs,我不知道我在想什么,是的,你是对的,你不需要测试通知名称。我四处摸索,EADemo示例代码测试了
self==self.navigationController.topViewController
,因此我确信这是正确的。对于第二个问题,延迟感觉是错误的。你在做你自己的动画吗?你在叫popViewControllerAnimated吗?它被多次调用吗?不,我不是在做我自己的动画。我不是说popViewController是动画的。我觉得计时器也不对。我实现了它,因为这是项目的另一个要求,我不确定下一步该如何解决这个问题。我没想到它会解决任何问题。我应该测试通知名吗?我以为这就是选择器的作用?如果我错了,我可以更改它。我在其他条件下添加了If(self==self.navigationInControl.topViewController)嵌套,这很有帮助。现在vc2只被调用一次。然而,当我点击导航栏后退按钮时,仍然会出现同样的错误。此外,我只是间歇性地(可能每5次一次)得到它们。发生的情况是,我按下vc2上的“后退”按钮,屏幕动画返回到vc1,但随后它似乎再次动画并出现“后退”按钮。我想我可能已经解决了第二个问题,但我不确定。我的下一步是实现一个延迟计时器。我决定做这件事,现在有5秒的延迟,它似乎在工作。嗨,Michelejs,我不知道我在想什么,是的,你是对的,你不需要测试通知名称。我四处摸索,EADemo示例代码测试了
self==self.navigationController.topViewController
,因此我确信这是正确的。对于第二个问题,延迟感觉是错误的。你在做你自己的动画吗?你在叫popViewControllerAnimated吗?它被多次调用吗?不,我不是在做我自己的动画。我不是说popViewController是动画的。我觉得计时器也不对。我实现了它,因为这是项目的另一个要求,我不确定下一步该如何解决这个问题。我没想到它会解决任何问题。还有人认为他的问题是在现实生活中,而不是在ios上?还有人认为他的问题是在现实生活中,而不是在ios上?