-viewWillAppear:와 -viewDidAppear:의 차이점은 무엇입니까?
사이의 차이점은 무엇입니까?-[UIViewController viewWillAppear:]
그리고.-[UIViewController viewDidAppear:]
?
일반적으로 제가 하는 일은 다음과 같습니다.
ViewDidLoad - 보기와 함께 표시되어야 하는 보기에 컨트롤을 추가할 때마다 즉시 해당 보기를
ViewDidLoad
이 됩니다.기본적으로 이 메서드는 보기가 메모리에 로드될 때마다 호출됩니다.예를 들어, 내 보기가 레이블이 3개인 양식이면 여기에 레이블을 추가합니다. 이러한 양식이 없으면 보기가 존재하지 않습니다.표시할 보기:사용합니다
ViewWillAppear
일반적으로 양식의 데이터를 업데이트하기 위한 것입니다.위의 예에서는 도메인의 데이터를 실제로 양식에 로드하는 데 사용합니다.UIViews
꽤 비쌉니다, 그리고 당신은 그것을 가능한 많이 피해야만 합니다.ViewWillAppear
이 것을 입니다.UIView
사용자에게, 그리고 여기서 하는 모든 무거운 일은 매우 눈에 보이는 방식으로 성능에 영향을 미칠 것입니다(예: 애니메이션 지연 등)표시된 보기:마침내, 나는 사용합니다.
ViewDidAppear
실행하는 데 시간이 오래 걸리는 작업에 대한 새 스레드를 시작합니다. 예를 들어 위 양식에 대한 추가 데이터를 얻기 위해 웹 서비스 호출을 수행하는 것입니다.좋은 점은 보기가 이미 존재하고 사용자에게 표시되고 있기 때문에 데이터를 가져오는 동안 사용자에게 좋은 "대기 중" 메시지를 표시할 수 있습니다.
viewDidLoad ===>>> 초기화 코드를 여기에 입력합니다.보기 수명 주기 동안 변경될 수 있는 동적 데이터를 넣지 마십시오.따라서 핵심 데이터에서 데이터를 추출하는 경우 뷰의 수명 동안 변경될 수 있다면 여기서 데이터를 추출하지 않을 수 있습니다.예를 들어 탭 컨트롤러가 있다고 가정합니다.탭 1에서 탭 2로 전환하고 탭 2의 모델에서 무언가를 변경합니다.탭 1로 돌아가서 모델 코드가 viewDidLoad에서 수행된 경우 이는 업데이트되지 않습니다(KVO 또는 NSFetchedResultsController 등을 사용하지 않는 경우 등).
viewWillAppear ===>>> 뷰가 이미 메모리에 있는지 여부에 관계없이 뷰가 나타나려고 할 때마다 호출됩니다.모델 로직과 같은 동적 코드를 여기에 넣습니다.
viewDidDidAppear ===>>> 네트워크 통화와 같이 보기가 화면에 확실히 표시되는 경우에만 수행할 값비싼 작업을 여기에 배치합니다.
주의: 앱이 백그라운드에서 실행되고 포그라운드로 돌아갈 경우 NS Notification Center를 사용하여 이 문제를 처리해야 합니다.저는 그것을 위해 아래 댓글에 코드를 작성했습니다.viewWillAppear/viewDidAppear가 실행될 것이라고 생각할 수 있습니다.거기에 중단점을 두고 테스트해 보세요.불이 안 붙습니다.따라서 백그라운드에서 앱이 변경된 경우 알림을 사용하여 업데이트해야 합니다.
그viewWillAppear
실제 뷰를 로드하기 전에 메서드를 호출합니다.
그viewDidAppear
보기가 이미 로드되어 있고 표시하려는 경우 메서드가 호출됩니다.
표시할 보기:
됩니다.
[ layoutSubviewsvc.view layoutSubviews] 앞에 됩니다.
표시된 보기:
가 뷰 된 후 됩니다.
[ layoutSubviews] (vc.view layoutSubviews] 뒤에 됩니다.
몇 가지 관측치:
그
viewDidLoad
메서드는 뷰가 처음 인스턴스화될 때 호출됩니다.IBOutlet
참조는 호출된 시간까지 연결되지만 이전에는 연결되지 않습니다. 그frame
하지만, 이것이 호출될 때까지 관점이 확립되지 않을 수 있습니다.이것은 하위 뷰와 관련 제약 조건을 추가/구성하기에 좋은 장소입니다. 만약 을 하고 .frame
으로 한 될 때까지 지연되어야 .viewWillAppear
또는viewDidLayoutSubviews
.그
viewWillAppear
메서드는 뷰 계층 구조에서 뷰의 프레젠테이션이 시작되려고 할 때 호출됩니다.특히, 이는 보기의 프레젠테이션 애니메이션(있는 경우)이 시작될 때 호출됩니다.동반자인 그의동반자것,자반동,viewWillDisappear
이 보기에서 벗어나는 전환이 시작될 때 분명히 호출됩니다.그
viewDidAppear
메소드는 보기의 프레젠테이션이 완료되었을 때, 특히 관련된 애니메이션이 모두 완료되었을 때 호출됩니다.동반자인 그의동반자것,자반동,viewDidDisappear
이 보기에서 벗어난 전환이 수행되면 이를 분명히 호출합니다.
두 가지 중요한 주의 사항:
viewDidLoad
보기가 처음 인스턴스화될 때 한 번만 호출됩니다. 에반면은,viewWillAppear
그리고.viewDidAppear
보기가 처음 표시될 때뿐만 아니라 이후에 문제의 동일한 보기가 다시 표시될 때마다 호출됩니다.예를 들어, 처음 보기를 표시할 때 이 세 가지 방법이 모두 호출됩니다.의 견해가 그 에 또 다른 견해를 하여 그 기각된 에는,viewWillAppear
그리고.viewDidAppear
일반적으로 문제의 보기가 추가되고 다시 보기 계층으로 애니메이션화될 때 다시 호출됩니다.viewDidLoad
하지 않을 것이다.viewDidLoad
이 특정 인스턴스를 처음 만들 때만 호출됩니다.따라서 보기가 다시 나타날 때마다 수행할 작업(예: 무시하거나 다시 표시)
viewWillAppear
또는viewDidAppear
보기를 처음 인스턴스화할 때만 수행하려면 다음에서 수행합니다.viewDidLoad
.소명.
viewWillAppear
해당 보기로의 전환이 완료될 것이라는 보장은 없습니다.특히 실시간 사용자 입력에 의해 구동되는 대화형 전환을 사용하는 경우 해당 대화형 전환이 취소될 수 있습니다.즉, 단지viewWillAppear
라고 불리는, 그것은 의미하지 않습니다.viewDidAppear
유언장이 왔습니다.일반적으로 그렇지만 대화형 제스처가 취소되면(전환이 완료되지 않았기 때문에) 취소되지 않습니다.전환의 에서 한 가 WWDC 2013의 이름을 한다고 .
viewWillAppear
"에게viewMightAppear
또는viewWillProbablyAppear
또는iReallyWishThisViewWouldAppear
".기본 제공 대화형 제스처의 예는 다음과 같습니다.
UINavigationController
그러면 "왼쪽 가장자리에서 이동"하여 보기 팝업을 시작합니다. 그viewWillAppear
이제스처를 해당 "왼쪽 에서 이동"을, 이업를한돌위작해기로가아이swipe동팝취처고업이되소면취하소서에가쪽리장자스제업팝왼을▁will▁is▁the이취고소되▁toswipe업팝▁the,면▁but▁view▁that▁to"하▁from▁edge▁are소취▁the▁if,▁you▁pop▁gesture▁left이▁be▁popping▁for▁"▁you▁return▁from"▁called▁which▁cancel▁back▁view동▁pop▁"▁canceled▁and팝서에▁to해위viewDidAppear
당신이 다시 방문하기 시작한 뷰는 결코 호출되지 않을 것이기 때문입니다.이것의 실질적인 효과는 당신이 모든 전화를 가정하는 코드를 작성하지 않도록 주의해야 한다는 것입니다.
viewWillAppear
나중에 전화가 올 것입니다.viewDidAppear
전환이 취소된 경우에는 그렇지 않습니다.
뷰를 로드하기 전에 특정 작업을 수행할 수 있도록 뷰를 로드하기 전에 뷰가 호출되고 뷰를 로드한 후에 표시된 뷰가 호출되어 포스트 작업이 해당 방법으로 수행됩니다.
표시할 보기:메모리에 실제로 로드된 보기는 보기 컨트롤러에서 한 번 호출되고 프레임이 있지만 사용자에게 표시되지 않았습니다.
표시된 보기:컨트롤러가 보기 계층에 추가되어 다음 컨트롤러에 표시할 수 있습니다. 또한 보기가 하위 보기를 레이아웃했습니다.
"의지"와 "행동"의 차이는...이름에서 알 수 있듯이 뷰가 표시되기 전에 WillAppear 뷰가 호출되고 뷰가 표시되었을 때 viewDidAppear가 호출됩니다.
전자는 보기가 나타나기 전에 발생하고 후자는 이후에 발생합니다.
요약:
-viewWillAppear -> 데이터 업데이트(테이블 뷰에서 데이터 다시 로드)
-viewDidAppear -> 비싼 작업 (진행상태 hud가 좋은 API 호출!)
이름에서 알 수 있듯이.viewWillAppear
보기가 표시되기 전에 호출됩니다.viewDidAppear
보기가 나타나면 호출됩니다.
유스케이스, 즉 언제 어느 것을 사용해야 합니까?
viewDidLoad
레이블, 버튼(즉, 컨트롤/서브뷰)이 View의 인터페이스 파일에 연결되어 있는 경우, ViewController's View와 동시에 이 모든 것을 로드하고 메모리에 한 번 로드하고 완료하려는 경우
viewWillAppear
예를 들어, 화면에 뷰 컨트롤러가 나타날 때마다 뷰의 배경색을 변경하려고 합니다.또는 보다 현실적으로 낮의 밤 시간에 DarkMode 배경색과 낮 시간에 배경 보기의 밝은 색을 원하는 경우 이 코드로 이동합니다.viewWillAppear
여기에 있는 또 다른 유용한 사용 사례 https://stackoverflow.com/a/39395865/5438240
또한 탐색 스택을 사용하는 경우(UINavigationController
), 팝업되려는 viewController에viewWillDisappear()
호출되고, 다음에 스택의 맨 위에 있을 View 컨트롤러는viewWillAppear()
불렀다
일반적으로 제가 하는 일은 다음과 같습니다.
ViewDidLoad - 뷰와 함께 표시되어야 하는 컨트롤을 뷰에 추가할 때마다 바로 ViewDidLoad 메서드에 추가했습니다.기본적으로 이 메서드는 보기가 메모리에 로드될 때마다 호출됩니다.예를 들어, 내 보기가 레이블이 3개인 양식이면 여기에 레이블을 추가합니다. 이러한 양식이 없으면 보기가 존재하지 않습니다.
표시할 보기:보통 ViewWillAppear를 사용하여 양식의 데이터를 업데이트합니다.위의 예에서는 도메인의 데이터를 실제로 양식에 로드하는 데 사용합니다.UIView를 만드는 것은 상당히 비용이 많이 들기 때문에 ViewWillAppear 메서드에서는 가능한 한 많이 피해야 합니다. 이 메서드가 호출되면 iPhone이 이미 UIView를 사용자에게 보여줄 준비가 되어 있고 여기서 많이 하는 작업은 매우 눈에 보이는 방식으로 성능에 영향을 미칩니다(예: 애니메이션 지연 등).
표시된 보기:마지막으로 ViewDidAppear를 사용하여 웹 서비스 호출을 통해 위의 양식에 대한 추가 데이터를 얻는 것과 같이 실행하는 데 시간이 오래 걸리는 작업에 대한 새 스레드를 시작합니다.좋은 점은 보기가 이미 존재하고 사용자에게 표시되고 있기 때문에 데이터를 가져오는 동안 사용자에게 좋은 "대기 중" 메시지를 표시할 수 있습니다.
viewDidLoad - 이 함수는 특정 뷰 컨트롤러 클래스가 메모리에 로드될 때 호출됩니다.이 방법을 사용하면 스토리보드/nib 파일에서 로드된 보기에 대해 추가 초기화를 수행할 수 있습니다.
ViewWillAppear - 보기 표시와 관련된 사용자 지정 작업을 알려주고 수행합니다.
ViewDidApper - 보기 표시와 관련된 추가 작업을 수행합니다.이 메서드를 재정의하는 경우 구현의 특정 시점에서 super를 호출해야 합니다.
언급URL : https://stackoverflow.com/questions/5630649/what-is-the-difference-between-viewwillappear-and-viewdidappear
'programing' 카테고리의 다른 글
pthread_message 및 pthread_message (0) | 2023.06.17 |
---|---|
vuex에서 약속을 중첩하는 이유는 무엇입니까? (0) | 2023.06.17 |
문자열 길이가 0이 아닐 경우 Excel 개수 (0) | 2023.06.17 |
스프링 데이터 jpa 쿼리에서 @lock timeout을 지정하는 방법은 무엇입니까? (0) | 2023.06.17 |
익명 유형 선언 목록 (0) | 2023.06.17 |