2014-11-05 3 views
4

안녕하세요 내가 Udemy의 과정을하고있는 중이 야 호출 될 때마다 실행하고, 아래 그림과 같이 코드가있는 viewDidLoad 함수에서 코드를 배치하기위한 호출코드는

override func viewDidLoad() { 
    super.viewDidLoad() 

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

} 

배열 APPEND해야 만 실행 한 번, 그러나, 다른 viewController로 가서 다시 돌아올 때 코드를 다시 추가하여 다시 추가합니다. 그래서 저는 이제 2 줄의 배열을 가지고 있습니다. 둘 다 Taj Mahal입니다.

viewDidLoad 함수는 코드를 한 번만 실행한다고 생각합니까?

이 방법이 있습니까?

감사합니다.

부록 : 저는 스위프트를 사용하기 때문에 viewController를 생성하고 시작하는 동안 어떤 alloc 및 init도 보지 못합니다. 이상하게 들리면 비디오 자습서에서는 viewDidLoad에서 작업하고 트레이너는 스토리 보드를 사용하여 초기 테이블보기 컨트롤러에서보기 컨트롤러의지도보기로 이동하고지도보기에 뒤로 버튼이 있습니다. 다시 스토리 보드를 통해 테이블 ​​뷰 컨트롤러로 돌아갑니다. - 내가 스위프트 언어의 최신 버전을 가지고 있고 트레이너가 이전 버전을 사용하고 있었기 때문에 (이전에 코딩 할 때 약간의 차이점이 있음을 알았으므로) 알 수 없었습니다. 어쨌든 그가 뒤로 버튼을 건 드리면 더 이상 추가 코드를 실행하지 않습니다. 트레이너에게 연락을 취하는 중입니다. 트레이너와 좋은 관계는 있지만 작동하지 않는 것 같습니다. 일단 내가 트레이너와 접촉하면 해결책을 제시 할 것입니다.

+0

어쩌면 다른 viewController에 segue하면 이전 하나는 dealloc이고, u가 다시로드되면 다시로드 할 것입니까?! – gran33

+3

당신은 아마 긴장을 풀지 않는 segue로 돌아올 것입니다. 너는 그렇게해서는 안된다. 그것은 새로운 인스턴스를 생성하고 실제로 돌아 오지 않습니다. – rdelmar

답변

1

보기 컨트롤러의 view로드가 완료되면 viewDidLoad 메서드가 호출됩니다. view은보기 컨트롤러의 view 속성이 nil이고 뭔가 액세스하려고하면로드됩니다. view가 (일반적으로 인해 메모리 제한) 언로드 한 경우 view 속성이 다음에 액세스 할 때

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

, 그것은 호출됩니다.

데이터 세트의 조작은 일반적으로보기 메소드 내에서 수행되지 않아야합니다. 이를 뷰 컨트롤러의 init (또는 다른 "데이터 소스"클래스)로 옮기는 것이 좋습니다.

+0

보다 구체적으로. viewDidLoad는 뷰 컨트롤러 뷰의 프레임이 호출 될 때마다 호출됩니다. 예를 들어 프레임 크기를 컨테이너의 크기로 설정하면 viewDidLoad가 적중합니다. 그러나 viewWillAppear & viewDidAppear는 addSubview (또는 변형) 이후까지 히트되지 않습니다. – GnarlyDog

+0

@GnarlyDog : 아니요, 이는 사실이 아닙니다. 'self.view.frame = someFrame'을 호출해도'view' 속성이 이미 설정되어 있으면'viewDidLoad'가 발생하지 않습니다. 예를 들어,'self.view.frame'은 화면을 회전시킬 때 설정되지만,'view'를 채우지 않으면 각 회전마다'viewDidLoad' 호출을 얻지 못합니다. –

+0

막연한 답변을 드려 죄송합니다. 나는 프레임을 설정할 때마다 init을 할당 한 후에는 그렇지 않다. 그냥 inited ViewController 다른 내부에 ViewController 할당하지만 그것을 제시하지 않았거나보기에 하위 뷰를 추가하지 않았습니다. viewDidLoad가 호출되지 않았습니다. 그러나 view.frame = my.view.frame을 설정하면 viewDidLoad가 호출됩니다. 하지만 viewWillAppear는 아니 었습니다. 본질적으로 viewDidLoad (및 loadView)는 느리게 호출되는 것 같습니다. – GnarlyDog

0

viewDidLoad 뷰 컨트롤러의 view 속성이 설정 될 때마다 호출됩니다. 이것이 언제 발생합니까? 이것은 뷰 컨트롤러가 포함되어있는 방법에 따라 달라

UINavigationController가 - 그들은 탐색 스택에 첨가합니다 (viewDidUnload 방법은되지 않지만)가 제거됨에 따라 "언로"대로보기 컨트롤러 뷰가로드된다.

UITabBarController -보기 컨트롤러보기는 화면에 있는지 여부에 관계없이 탭 표시 줄에 추가 될 때로드됩니다. 탭에서 탭으로 변경 될 때로드 된 상태로 유지됩니다.

필요에 따라 필요에 맞는 뷰 컨트롤러 컨테이너를 직접 만들 수 있습니다. Apple 문서에서 올바른 방법을 확인하십시오. https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

0

viewDidLoad에서 데이터 초기화를 수행하려고한다고 가정합니다.다른 viewDidLoad에 전에 placesArray에 작동하고 대신 APPEND가없는 경우, 무엇을 직접 placesArray 설정에 대한 :

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

를 다음보기는 어떤 이유로 언로드 경우에도 마찬가지입니다. 타지 마할은 한 번만 추가됩니다.