UIViewController viewDidLoad 대 viewWillAppear : 적절한 분업은 무엇입니까?


164

나는 항상 서브 클래스 에서 viewDidLoadvs.에 할당 해야하는 작업 유형에 대해 약간 불분명했습니다 .viewWillAppearUIViewController

예를 들어 UIViewController서버를 때리고 데이터를 가져 와서 뷰에 공급 한 다음 해당 뷰를 표시 하는 하위 클래스 가있는 앱을 만들고 있습니다. 이 일의 장점과 단점은 무엇입니까 viewDidLoad대는 viewWillAppear?

답변:


251

viewDidLoad는 한 번만 수행해야하는 작업입니다. 뷰가 나타날 때마다 viewWillAppear가 호출됩니다. UIDabel 텍스트 설정과 같이 viewDidLoad에서 한 번만 수행해야하는 작업을 수행해야합니다. 그러나 사용자가 볼 때마다보기의 특정 부분을 수정하고 싶을 수 있습니다. 예를 들어 iPod 응용 프로그램은 "지금 재생 중"보기로 갈 때마다 가사를 맨 위로 스크롤합니다.

그러나 서버에서 항목을로드 할 때 대기 시간도 고려해야합니다. 모든 네트워크 통신을 viewDidLoad 또는 viewWillAppear로 압축하면 사용자가보기를보기 전에 실행되어 앱이 잠시 정지 될 수 있습니다. 먼저 어떤 종류의 활동 표시기가있는 채워지지 않은보기를 사용자에게 표시하는 것이 좋습니다. 네트워킹이 완료되면 1-2 초가 걸리거나 실패 할 수도 있습니다. 데이터를 사용하여 뷰를 채울 수 있습니다. 이를 수행하는 방법에 대한 좋은 예는 다양한 트위터 클라이언트에서 볼 수 있습니다. 예를 들어 Twitterrific에서 작성자 세부 정보 페이지를 볼 때 네트워크 쿼리가 완료 될 때까지 "로드 중 ..."만 표시됩니다.


따라서 viewWillAppear와 관련하여 잠재적으로 반복적으로 호출됩니다. 예를 들어 viewcontrollers 뷰가 숨겨진 후에 표시되면 해당 메소드가 실행됩니까? viewDidLoad를 호출하지 않고 viewWillAppear를 어떤 scenerio에서 호출합니까?
dugla

7
viewDidLoad ONLY는 뷰가 생성 될 때 호출됩니다. 예를 들어 뷰에 액세스 할 때 뷰 컨트롤러 initFromNibNamed 호출 후. viewWillAppear는 뷰 컨트롤러가 보이지 않지만 뷰에 들어올 때마다 호출되므로 뷰 컨트롤러를 누르면 viewWillAppear가 호출됩니다. 거기에서 다른 하위 뷰를 푸시하고 사용자가 돌아 오면 viewWillAppear가 다시 호출됩니다.
Kendall Helmstetter Gelner

고마워 켄달. 예, 전략적으로 배치 된 몇 가지 NSLog가 정렬되었습니다. viewWillAppear / viewWillViewController 푸시 / 팝에서 발사가 사라집니다.
dugla

3
메모리 관련 이유로보기를 숨기고 언로드하면 viewDidLoad도 호출되어 다시 나타납니다. 신뢰할 수있는 것 :보기가 처음 생성 될 때 viewDidLoad가 호출되고 숨겨진 후보기가 다시 나타날 가능성이 더 높습니다. 뷰가 화면에 나타나려고 할 때 항상 viewWillAppear가 호출됩니다.
DanM

2
누군가 다음 두 가지 관련 질문에 대해 더 언급 할 수 있습니까? (1) 때때로, 컨트롤의 프레임 값 (예 : 원점 및 크기)이 viewDidLoad에서 0이고 때로는 --Why가 아닌 이유는 무엇입니까? (2) splitViewController의 detailView (iPad)에 대한 Apple의 템플릿에는 configureView 메소드가 있습니다. viewDidLoad 및 ViewWillAppear와 관련하여 무엇이 있어야합니까?
Jeff

12

처음에는 tableView와 함께 ViewDidLoad 만 사용했습니다. Wifi가 손실 된 테스트에서 장치를 비행기 모드로 설정하여 Wifi를 반환해도 테이블이 새로 고쳐지지 않음을 알았습니다. 실제로 -Info.plist에서 백그라운드 모드가 YES로 설정된 홈 버튼을 눌러도 장치에서 tableView를 새로 고칠 수있는 방법이 없습니다.

내 해결책 :

-(void) viewWillAppear: (BOOL) animated { [self.tableView reloadData];}

10

포지셔닝에 viewDidLoad를 사용하는 것은 약간 위험하므로 경계가 설정되지 않았으므로 피해야합니다. 예기치 않은 결과가 발생할 수 있습니다 (다양한 문제가 발생했습니다 ...)

이 게시물 은 다른 방법과 각 방법에서 발생하는 일에 대해 잘 설명합니다.

현재 일회성 초기화 및 위치 지정을 위해 다른 권장 사항이있는 사람이 있으면 viewDidAppear를 플래그와 함께 사용할 생각입니다.


이에 동의 : "... 범위를 설정하지 않았으므로 피해야합니다 ..."
danisupr4

4

뷰를 열 때 마다 데이터를로드해야 합니까? 아니면 한 번만 ?

여기에 이미지 설명을 입력하십시오

  • 빨간색 : 매번 변경할 필요가 없습니다. 일단로드되면 원래 상태 그대로 유지됩니다.
  • 자주색 : 시간이 지남에 따라 또는 매번로드 한 후에 변경해야합니다. 동일한 추천 사용자 3 명을보고 싶지 않다면 화면으로 돌아올 때마다 다시로드해야합니다. 그들의 사진이 업데이트 될 수 있습니다 ... 5 년 전의 사진을보고 싶지 않습니다 ...

viewDidLoad:어떤 처리를 수행하든 한 번 수행해야합니다.
viewWilLAppear:페이지가로드 될 때마다 변경해야하는 처리

레이블, 아이콘, 버튼 제목 또는 대부분의 dataInputedByDeveloper는 일반적으로 변경되지 않습니다. 이름, 사진, 링크, 버튼 상태, 목록 (tableView 또는 collectionView의 입력 배열) 또는 대부분의 dataInputedByUser는 일반적으로 변경됩니다.


보라색은 viewDidAppear하지 viewWillAppear 호출 할 것이다
알렉스 Kornhauser

@AlexKornhauser 이것이 무엇을 의미합니까? 나는 당신 viewWillAppear이 최신 트윗을 쿼리하고 확인할 수 있다고 말하고 있습니다. viewDidAppear너무 늦었 어
Honey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.