programing

-viewWillAppear:와 -viewDidAppear:의 차이점은 무엇입니까?

powerit 2023. 6. 17. 09:44
반응형

-viewWillAppear:와 -viewDidAppear:의 차이점은 무엇입니까?

사이의 차이점은 무엇입니까?-[UIViewController viewWillAppear:]그리고.-[UIViewController viewDidAppear:]?

일반적으로 제가 하는 일은 다음과 같습니다.

  1. ViewDidLoad - 보기와 함께 표시되어야 하는 보기에 컨트롤을 추가할 때마다 즉시 해당 보기를ViewDidLoad됩니다.기본적으로 이 메서드는 보기가 메모리에 로드될 때마다 호출됩니다.예를 들어, 내 보기가 레이블이 3개인 양식이면 여기에 레이블을 추가합니다. 이러한 양식이 없으면 보기가 존재하지 않습니다.

  2. 표시할 보기:사용합니다ViewWillAppear일반적으로 양식의 데이터를 업데이트하기 위한 것입니다.위의 예에서는 도메인의 데이터를 실제로 양식에 로드하는 데 사용합니다. UIViews꽤 비쌉니다, 그리고 당신은 그것을 가능한 많이 피해야만 합니다.ViewWillAppear 이 것을 입니다.UIView사용자에게, 그리고 여기서 하는 모든 무거운 일은 매우 눈에 보이는 방식으로 성능에 영향을 미칠 것입니다(예: 애니메이션 지연 등)

  3. 표시된 보기:마침내, 나는 사용합니다.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()불렀다

일반적으로 제가 하는 일은 다음과 같습니다.

  1. ViewDidLoad - 뷰와 함께 표시되어야 하는 컨트롤을 뷰에 추가할 때마다 바로 ViewDidLoad 메서드에 추가했습니다.기본적으로 이 메서드는 보기가 메모리에 로드될 때마다 호출됩니다.예를 들어, 내 보기가 레이블이 3개인 양식이면 여기에 레이블을 추가합니다. 이러한 양식이 없으면 보기가 존재하지 않습니다.

  2. 표시할 보기:보통 ViewWillAppear를 사용하여 양식의 데이터를 업데이트합니다.위의 예에서는 도메인의 데이터를 실제로 양식에 로드하는 데 사용합니다.UIView를 만드는 것은 상당히 비용이 많이 들기 때문에 ViewWillAppear 메서드에서는 가능한 한 많이 피해야 합니다. 이 메서드가 호출되면 iPhone이 이미 UIView를 사용자에게 보여줄 준비가 되어 있고 여기서 많이 하는 작업은 매우 눈에 보이는 방식으로 성능에 영향을 미칩니다(예: 애니메이션 지연 등).

  3. 표시된 보기:마지막으로 ViewDidAppear를 사용하여 웹 서비스 호출을 통해 위의 양식에 대한 추가 데이터를 얻는 것과 같이 실행하는 데 시간이 오래 걸리는 작업에 대한 새 스레드를 시작합니다.좋은 점은 보기가 이미 존재하고 사용자에게 표시되고 있기 때문에 데이터를 가져오는 동안 사용자에게 좋은 "대기 중" 메시지를 표시할 수 있습니다.

viewDidLoad - 이 함수는 특정 뷰 컨트롤러 클래스가 메모리에 로드될 때 호출됩니다.이 방법을 사용하면 스토리보드/nib 파일에서 로드된 보기에 대해 추가 초기화를 수행할 수 있습니다.

ViewWillAppear - 보기 표시와 관련된 사용자 지정 작업을 알려주고 수행합니다.

ViewDidApper - 보기 표시와 관련된 추가 작업을 수행합니다.이 메서드를 재정의하는 경우 구현의 특정 시점에서 super를 호출해야 합니다.

언급URL : https://stackoverflow.com/questions/5630649/what-is-the-difference-between-viewwillappear-and-viewdidappear

반응형