2013-06-19 5 views
2

У меня есть UIViewController *vc1 с 4 кнопками. Каждая кнопка вызывает нажатие на другой UIViewController *vc2. vc2 показывает некоторую информацию, на основе которой была нажата кнопка. Я передаю информацию от vc1 до vc2 в vc1's prepareForSegue (ее просто значение int). Все это прекрасно работает. Теперь мне нужно сделать так, чтобы vc2 также был вызван, если iphone находится на vc1 (vc1 isVisible), а vc1 получает UINotification (что-то происходит с устройством Bluetooth). Вот мой код:performSegueWithIdentifier и prepareForSegue

-(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 &». Заканчивал переход navigaion в непредвиденном состоянии . Дерево навигации в навигационной панели может быть повреждено.

Эти ошибки возникают после нажатия кнопки «Назад». Я добавил NSLog заявления, поэтому я знаю, что vc2's viewDidLoad получает вызов дважды каждый раз.

Я создал нажимные сегменты для всех 4 кнопок, используя раскадровку. Я их не назвал. Я создал событие push segue через раскадровку, а также дал ему идентификатор "detected". Я надеюсь, что кто-то здесь имеет некоторое представление о том, что я делаю неправильно. Поблагодарите совет. Благодарю.

Вот текущий код:

-(void)viewDidAppear:(BOOL)animated 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exerciseDetected:) name:@"ExerciseDetected" object:nil]; 
    [[NSNotifcationCenter defaultCenter] addObserver:self selector:@selector(cancelExercise:) [email protected]"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]; 
} 
+0

Кто-нибудь еще думает, что его вопрос был в реальной жизни, а не у ios specific? –

ответ

4

Вы определенно должны вызывать только performSegueWithIdentifier когда самость верхний контроллер

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

    ... 
} 

вид Если вы должны быть уверены, что что-то вызывается только один раз вы можете do:

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

Если вам нужно запустить что-то в следующем запуске цикла n вы можете сделать:

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

Должен ли я проверить имя уведомления? Я думал, для чего нужен селектор? Если я ошибаюсь, я могу это изменить. – MichelleJS

+0

Я добавил, если (self == self.navigatioinController.topViewController) вложен в другое мое состояние, и это помогло много. Теперь vc2 вызывается только один раз. Тем не менее, я все еще получаю те же ошибки, когда я нажимаю кнопку назад на панели навигации. Также я получаю их только с перерывами (возможно, раз в 5 раз). Что происходит, так это то, что я нажимаю кнопку «Назад» на vc2, и экран оживает обратно в vc1, но потом кажется, что он снова оживает, и появляется кнопка «Назад». – MichelleJS

+0

Думаю, я, возможно, решил вторую проблему, но я не уверен. Следующим шагом было реализовать таймер задержки. Я решил работать над этим, и теперь, когда есть 5-секундная задержка, похоже, он работает. – MichelleJS

Смежные вопросы