Я использовал NSTimer и в конце обратного отсчета хочу изменить значение View.UILabel.text=@"Time Up". Это работает отлично, пока я не переключусь на какой-то другой ViewController, после переключения между viewController (и возвращением к этому viewController), когда завершится обратный отсчет, я получаю идеальные значения, и их значение не равно нулю, но значение View.UILabel.text не меняется, я проверены исключения, исключения не возникают.

Мой код:

-(void) timeInterval
{ 
 appdelegate._UserProfile.totalTime = 30;

 UIApplication *app = [UIApplication sharedApplication];

 //will allow NSTimer to continue running in background..

 UIBackgroundTaskIdentifier bgTask = 0;

 bgTask = [app beginBackgroundTaskWithExpirationHandler:^{

 [app endBackgroundTask:bgTask];
    }];

 appdelegate._UserProfile.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self     selector:@selector(countDown) userInfo:nil repeats:YES];

}

-(void) countDown
{
   appdelegate._UserProfile.totalTime -= 1;

 if(appdelegate._UserProfile.totalTime == 0)   
 {
    [profileView.userPhoneNo setText:@""];

    profileView.timeUp.text= @"* Time Up";
  }

}

Пожалуйста, любая помощь будет очень признательна. (Я видел много вопросов, но моя проблема не решена)

*Примечание: после переключения, если я изменяю значение метки в ViewWillAppear(), она работает отлично, но мне нужно изменить текст, когда завершится обратный отсчет. Я использую UINavigationController & MFSideMenuManager для переключения между ViewController.

Мой навигационный код:

-(void) initMyProfile 
{
UINavigationController *detailNavigationController = [MFSideMenuManager sharedManager].navigationController;

 detailNavigationController.menuState = MFSideMenuStateHidden;

 MyProfileViewController_iPhone* detailViewController = [[MyProfileViewController_iPhone alloc] initWithNibName:nil bundle:nil];

  detailViewController.title = @"My Profile";

detailNavigationController.viewControllers = [NSArray arrayWithObject:detailViewController];

}
-1
Syed Nazar Muhammad 3 Дек 2014 в 14:39

2 ответа

Если вы возвращаетесь к представлению, нажимая кнопку «Назад» и вызывая эти методы в viewDidLoad, это проблема.

ViewDidLoad вызывается только после создания контроллера представления, чтобы вызывать эти методы каждый раз, когда вы открываете контроллер просмотра, вызывайте эти методы в viewWillAppear.

1
Arthur Henrique de Oliveira 3 Дек 2014 в 17:06

Одно из возможных объяснений состоит в том, что вы возвращаетесь не к исходному контроллеру представления, а к новому новому экземпляру. Это может легко произойти при использовании стандартного перехода вместо перехода с раскруткой.

См. этот другой вопрос, где возникла аналогичная проблема: Изменение текста метки внутри метода

1
Community 23 Май 2017 в 14:43
Я не использую Segue, вместо этого делаю все программно
 – 
Syed Nazar Muhammad
3 Дек 2014 в 14:47
Можете ли вы поставить точку останова в своем блоке кода «Time Up» и посмотреть, вызывается ли он вообще? Если это так, но вы не видите отображаемый результат, я думаю, возможно, у вас есть несколько экземпляров. Попробуйте поставить точку останова в инициализаторе вашего View Controller и посмотрите, выполняется ли она более одного раза.
 – 
Clafou
3 Дек 2014 в 14:50
Да, я проверил это, поставив точки останова. Блок "Time Up" вызывается
 – 
Syed Nazar Muhammad
3 Дек 2014 в 14:52
И вызывается ли инициализатор вашего контроллера представления более одного раза?
 – 
Clafou
3 Дек 2014 в 14:56
MyProfile — это представление, которое принимает все представление ViewController с помощью self.vew = profileView; & Я инициализировал представление в -(void)loadview, например profileView = [[MyProfile alloc] ininiwitht..];
 – 
Syed Nazar Muhammad
3 Дек 2014 в 14:59