2015-06-23 9 views
1

У меня есть виртуальный канал под названием ViewControllerOne, когда пользователь стучит UITableViewCell я называю push segue и перейти к ViewControllerTwo. В ViewControllerTwo я прячусь панель навигации, поэтому я создал пользовательский заднюю кнопку:viewDidLoad вызывался каждый раз после вызова popViewControllerAnimated:

- (IBAction)backBttn:(id)sender { 

    [self.navigationController popViewControllerAnimated:YES]; 

} 

, который прекрасно работает, но viewDidLoad вызывался (в ViewControllerTwo) каждый раз я вернуться обратно ViewControllerOne и чем открытая ViewControllerTwo еще раз. Правильно ли, что viewDidLoad получил вызов, потому что я использую [self.navigationController popViewControllerAnimated:YES]? Или у него должна быть другая причина?

+0

В каком подклассе UIViewController вызывается 'viewDidLoad', вызываемый несколько раз? – ndmeiri

+0

@ndmeiri в 'ViewControllerTwo' – rihe

ответ

1

Если я правильно понимаю вас, вы видите, что viewDidLoad вызван на контроллер вида, на который вы нажимаете. (ViewControllerTwo). Если вы нажмете с ViewControllerOne на ViewControllerTwo, вызывается ViewControllerTwoDidLoad.

Если затем нажмите кнопку назад, чтобы совать ViewControllerTwo, вернитесь к ViewControllerOne, а затем нажмите на ViewControllerTwo снова, вы видите viewDidLoad называться второй раз.

Ожидаемое поведение. Push segues (и все остальные сегменты, кроме разматывания) создают новый экземпляр контроллера представления, который они представляют.

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

+0

Спасибо Дункан, хорошо знать, что это нормальное поведение. Как вы думаете, это плохая рутина, и мне нужно найти другое решение? Или все в порядке? На самом деле все работает нормально, но мне нужно получать некоторые данные с сервера каждый раз, когда я открываю 'ViewControllerTwo', и я немного смущен, где это следует делать, потому что обычно я делаю это в' viewWillAppear', но в в этом случае кажется, что 'viewDidLoad' тоже прекрасен. – rihe

+1

Как правило, вам не следует выполнять сетевые транзакции каждый раз, когда вы загружаете контроллер вида. Вместо этого у вас есть синглтон сетевого менеджера, который выполняет вашу работу, и помнит, как недавно он извлекал данные. Когда вы вернетесь к контроллеру просмотра, спросите у менеджера сети, есть ли у вас текущие данные. Если да, используйте его. Если нет, запросите обновление у сетевого менеджера. –

1

Когда вы выталкиваете контроллер вида из стека навигации, вид, который он управляет, освобождается (или выгружается). Поэтому, когда вы снова открываете ViewControllerTwo, представление должно быть загружено снова. Вот почему viewDidLoad вызывается несколько раз в вашем случае.

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