2014-11-05 14 views
4

Привет всем Я делаю курс в Udemy, а код требует добавления кода в функции viewDidLoad, как показано ниже:код в viewDidLoad запускается каждый раз, когда он называется

override func viewDidLoad() { 
    super.viewDidLoad() 

    placesArray.append(["name":"Taj Mahal", "lat":"27.175607", "lon":"78.042112"]) 

} 

Массив Append должен работать только один раз, однако, когда я перехожу к другому viewController и возвращаюсь, он запускает код для добавления снова. Итак, теперь у меня есть массив с 2 строками, оба из которых - Тадж-Махал.

Я думал, что функция viewDidLoad запускает код только один раз?

Есть ли способ обойти это?

Спасибо.

Приложение: Я использую Swift, поэтому я не вижу никакого выделения и init при создании и запуске viewController. И, как ни странно, в этом видеоролике он работает в viewDidLoad, и тренер использует раскадровку для перехода от исходного контроллера табличного представления к виду карты на контроллере представления и просто имеет кнопку «Назад» на карте, которая показывает, что segue's обратно к контроллеру табличного представления через раскадровку. - Может быть, потому, что у меня есть последняя версия языка Swift, и тренер использовал более раннюю версию (потому что я заметил некоторые незначительные отличия в кодировании ранее), но вы никогда не знаете. В любом случае, когда он касается кнопки «Назад», он больше не запускает код добавления. Я пытаюсь установить контакт с тренером, так как некоторые из предложений здесь, хотя они хороши, похоже, не работают. Я поставлю решение здесь, как только свяжусь с тренером.

+0

Может быть, когда вы переходите к другому viewController, старый является dealloc, а когда u вернулся, он снова загружается ?! – gran33

+3

Вы, вероятно, вернетесь с сеге, который не расслабляется. Вы не должны этого делать. Он создает новый экземпляр, он на самом деле не возвращается. – rdelmar

ответ

1

Метод viewDidLoad вызывается, когда контроллер вашего вида view заканчивает загрузку. view будет загружаться, если view имеет вид контроллера nil и что-то пытается его получить.

UIViewController *myVC = [[UIViewController alloc] init]; 
UIView *aView = myVC.view; // this loads myVC's view; viewDidLoad is called when it completes loading. 

view Если выгрузил (обычно из-за ограничений памяти), она будет называться, когда свойство view имеет следующий доступ.

Манипулирование наборами данных обычно не должно выполняться в рамках методов просмотра. Подумайте о переносе этого на init контроллера вида (или на другой класс «источник данных»).

+0

Более конкретно. viewDidLoad вызывается всякий раз, когда вызывается кадр представления контроллера представления. Так, например, если вы установите размер кадра на размер контейнера, тогда будет виден viewDidLoad. Но viewWillAppear & viewDidAppear не пострадает до тех пор, пока addSubview (или вариант) – GnarlyDog

+0

@GnarlyDog: Нет, это неверно. Вызов 'self.view.frame = someFrame' не вызывает' viewDidLoad', если свойство 'view' уже установлено. Например, 'self.view.frame' устанавливается, когда вы поворачиваете свой экран, но вы не получаете вызов' viewDidLoad' для каждого вращения, если вы не нажмете свой 'view'. –

+0

Извините за смутный ответ. Я специально имел в виду после того, как вы назначили init, а не каждый раз, когда вы устанавливаете фрейм. Я просто выделил ViewController внутри другого, но не представил его или не добавил его в представление. viewDidLoad не вызывался. Однако, если я установил view.frame = my.view.frame, тогда был вызван viewDidLoad. НО viewWillAppear не было. По сути, viewDidLoad (и loadView), кажется, называется лениво. – GnarlyDog

0

viewDidLoad вызывается всякий раз, когда задано свойство представления контроллера вида. Когда это происходит? Это зависит от того, как содержатся контроллер вида:

UINavigationController - вид Вида контроллера загружается как они будут добавлены к навигации стеке и «выгружены» (хотя метод viewDidUnload является устаревшим), как они будут удалены.

UITabBarController - View Представления контроллера загружаются по мере их добавления на панель вкладок независимо от того, находятся они на экране или нет. Они остаются загруженными при переходе от вкладки к вкладке.

В зависимости от ваших потребностей и использования, вы можете создать свой собственный контейнер контроллера вида, который сделает все, что вам нужно. Оформите документы Apple надлежащим образом: https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

0

Я полагаю, вы пытаетесь выполнить инициализацию данных в viewDidLoad.Если нет другой операции placesArray перед тем viewDidLoad, то вместо того, Append, что о настройке placesArray непосредственно:

placesArray = ["name":"Taj Mahal", "lat":"27.175607", "lon":"78.042112"] 

Тогда, даже если ваш вид выгружается по некоторым причинам. Тадж-Махал все равно будет добавлен только один раз.

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