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


131

차이점은 무엇이며 -[UIViewController viewWillAppear:]그리고 -[UIViewController viewDidAppear:]?


1
BoltClock에게 감사드립니다. 그러나 가능하다면 두 가지 예를 들어주십시오.
PJR

3
@BoltClock 그것이 사실이라면 좋을 것입니다. 나는 upvoted했던 15 명의 사람들이 분석법 이름을 읽었지만 실제로 그것을 측정 한 적이 없다고 추측하고있다. 구글에서 온 이유는 그들 사이의 차이가 아니기 때문이다
Adam

1
구체적으로 : Apple이 실제로 parentView를 표시하기 전에 parentView.viewDidAppear를 오랜 시간이라고합니다 ... Apple은 먼저 모든 (아토믹) 모든 서브 뷰를 페인트합니다 ... 서브 뷰가 많거나 복잡한 뷰가있는 경우 "viewDidAppear"는 10이라고 할 수 있습니다 또는 수백 밀리 초도 너무 빨리 :(.
Adam

답변:


292

일반적으로 이것은 내가하는 일입니다.

1) ViewDidLoad- 뷰와 함께 표시되어야하는 뷰에 컨트롤을 추가 할 때마다 ViewDidLoad 메서드에 넣습니다. 기본적으로이 메소드는 뷰가 메모리에로드 될 때마다 호출됩니다. 예를 들어 뷰가 3 개의 레이블이있는 양식 인 경우 여기에 레이블을 추가합니다. 그러한 형태가 없다면보기는 절대 존재하지 않을 것입니다.

2) ViewWillAppear : ViewWillAppear을 사용하여 양식의 데이터를 업데이트합니다. 따라서 위의 예에서는이 정보를 사용하여 실제로 내 도메인의 데이터를 양식에로드합니다. UIViews 작성은 상당히 비싸므로 ViewWillAppear 메소드에서 가능한 한 많이 피해야합니다.이를 호출하면 iPhone이 이미 UIView를 사용자에게 보여줄 준비가되어 있으며 여기에서 무거운 것을 수행한다는 의미입니다 애니메이션이 지연되는 등 매우 눈에 띄는 방식으로 성능에 영향을줍니다.

3) ViewDidAppear : 마지막으로 ViewDidAppear를 사용하여 위의 양식에 대한 추가 데이터를 얻기 위해 웹 서비스 호출을 수행하는 것과 같이 실행하는 데 오랜 시간이 걸리는 작업에 대한 새 스레드를 시작합니다. 이미 존재하고 사용자에게 표시되는 경우 데이터를받는 동안 사용자에게 멋진 "대기"메시지를 표시 할 수 있습니다.


4
죄송합니다. "도메인에서 데이터를 양식에로드"란 무엇을 의미 viewWillAppear합니까? 네트워크를 통한 다운로드를 의미합니까? 그러나 당신은 또한 다운로드 물건을 제안 viewDidAppear?
Philip007

1
@ Philip007 스택이 이러한 유형의 도메인을 참조한다고 생각합니다. en.wikipedia.org/wiki/Domain-specific_modeling . 데이터는 모델 등에서로드됩니다.
dentarg

2
이 답변은 문서에 있어야합니다. 세 가지 방법의 차이점을 명확히하는 데 정말 도움이되었습니다. 감사합니다!
GangstaGraham

1
+1이 세 가지의 차이점을 이해하는 데 약간의 혼란이 있었지만, @ChetanBhalara
Chisx

@ChetanBhalara하지만 당신은 긴 작업을 넣으면 ViewDidAppear쉽게 : UI에 대한 사용자의 혼동 만들 것
hqt

46

viewDidLoad === >>> 여기에 초기화 코드를 넣으십시오. 뷰 수명주기 동안 변경 될 수있는 동적 데이터를 넣지 마십시오. 따라서 핵심 데이터에서 데이터를 가져 오는 경우 뷰 수명 동안 변경 될 수있는 경우 여기에서 수행하고 싶지 않습니다. 예를 들어 탭 컨트롤러가 있다고 가정하십시오. tab1에서 tab2로 전환하고 tab2의 모델에서 무언가를 변경합니다. tab1로 돌아와 모델 코드가 viewDidLoad에서 수행 된 경우 KVO 또는 NSFetchedResultsController 등을 사용하지 않는 경우 업데이트되지 않습니다.

viewWillAppear === >>> 뷰가 이미 메모리에 있는지 여부에 관계없이 뷰가 나타나려고 할 때마다 호출됩니다. 모델 논리와 같은 동적 코드를 여기에 넣으십시오.

viewDidAppear === >>> 네트워크 호출과 같이 화면이 화면에 표시되어있는 경우에만 수행 할 값 비싼 작업을 여기에 배치하십시오.

참고 : 앱이 백그라운드에 있고 포 그라운드로 돌아 오는 경우 NSNotificationCenter를 사용하여이를 처리해야합니다. 아래 주석에서 코드를 작성했습니다. viewWillAppear / viewDidAppear가 실행된다고 생각할 수 있습니다. 거기에 중단 점을두고 테스트하십시오. 발사하지 않습니다. 따라서 백그라운드에서 앱에 변경된 사항이있는 경우 알림을 사용하여 업데이트해야합니다.


1
응용 프로그램을 최소화 할 때마다 ViewWill 또는 ViewDid가 실행됩니까?
Jeef

2
@Jeef 이것은 훌륭한 질문입니다. 백그라운드에서 시스템 또는 사용자가 앱을 종료하지 않으면 실행되지 않습니다. 앱이 최소화되지 않은 경우 알림을 받으려면 UIApplicationWillEnterForegroundNotification이라는 이름으로 NSNotificationCenter 및 addObserver를 사용해야합니다. 선택기는 applicationWillEnterForeground 여야합니다. NSNotification 매개 변수가 있습니다. 데이터를 다시로드하는 등의 방법으로 코드를 작성하십시오. 수행 할 수있는 작업은이 메소드에서 호출하는 reload 메소드를 작성하고 동일해야하는 경우 viewDidAppear를 작성하는 것입니다.
smileBot

2
@Jeef 다음과 같은 내용 :-(void) viewDidLoad {[[NSNotificationCenter defaultCenter] addObserver : 자체 선택기 : @selector (applicationWillEnterForeground :) 이름 : UIApplicationWillEnterForegroundNotification object : nil]; }-(void) applicationWillEnterForeground : (NSNotification *) notif {// 무엇이든 여기에 응답}
smileBot

12

viewWillAppear방법은 실제보기를로드하기 전에 호출된다.

viewDidAppear메소드는 뷰가 이미로드되어 있고 무언가를 표시하려고 할 때 호출됩니다.


9

viewWillAppear :
■보기가 창보기 계층 구조에 추가
되기 전에 호출 ■ [vc.view layoutSubviews] 전에 호출 (필요한 경우)
viewDidAppear :
■보기가보기 계층 구조에 추가 된
후 호출 ■ [vc.view layoutSubviews] 이후에 호출 (필요하다면)


7

몇 가지 관찰 :

  • viewDidLoad뷰가 처음 인스턴스화 될 때 메서드가 호출됩니다. IBOutlet참조는 이것이 호출 된 시점에 연결되지만 이전에는 호출되지 않습니다. 그러나 frame이것이 호출 된 시점에는보기가 설정되지 않을 수 있습니다. 여기에는 하위보기 및 관련 제약 조건을 추가 / 구성 할 수있는 좋은 장소입니다. 그러나 frame메인 뷰의 치수를 기준으로 값을 수동으로 구성하는 경우 해당 프레임의 구성은 viewWillAppear또는 까지 지연되어야합니다 viewDidLayoutSubviews.

  • viewWillAppear뷰 계층의보기의 프리젠 테이션을 시작하려고 할 때 메서드가 호출됩니다. 특히 이것은 뷰의 프리젠 테이션의 애니메이션 시작시 호출됩니다. 그 viewWillDisappear견해는이 견해에서 벗어난 전환이 시작될 때 분명히 호출됩니다.

  • viewDidAppear방법은 뷰의 표현이 완료 될 때, 특히 모든 관련 애니메이션이 완료되었을 때 호출됩니다. viewDidDisappear이 견해에서 벗어난 전환이 완료되면 동반자 가 분명하게 호출됩니다.

두 가지 중요한 경고 사항 :

  • viewDidLoad뷰가 처음 인스턴스화 될 때 한 번만 호출됩니다. 반면에, viewWillAppear그리고 viewDidAppear뷰가 처음 제시하지 않을 경우에만 호출하지만, 이후의 모든 시간은 문제의 동일한 뷰는 다시 발표입니다됩니다. 예를 들어, 처음으로보기를 제시하면이 세 가지 메소드가 모두 호출됩니다. 문제의보기는 이후 연속적으로 기각되면, 다른보기 나타낸다면 viewWillAppearviewDidAppear문제의보기를 추가하고 다시 뷰 계층에 애니메이션 때 일반적으로 다시 호출 될 것이다,하지만 viewDidLoad하지 않습니다를. viewDidLoad이 특정 인스턴스가 처음 생성 될 때만 호출됩니다.

    따라서보기가 다시 나타날 때마다 작업을 수행하려면 (예 : 닫거나 다시 표시) viewWillAppear또는 에서 수행하십시오 viewDidAppear. 보기가 처음 인스턴스화 될 때만 발생하도록하려면에서 수행하십시오 viewDidLoad.

  • 을 호출 viewWillAppear한다고해서 해당 뷰로의 전환이 완료되는 것은 아닙니다. 특히, 실시간 사용자 입력으로 구동되는 대화식 전이를 사용하고 있지만 대화식 전이는 취소 될 수 있습니다. 즉, viewWillAppear부름을 받았다고 해서 그것이 viewDidAppear부름을 의미하는 것은 아닙니다 . 일반적으로 대화 형 제스처가 취소되면 전환이 완료되지 않았기 때문에 취소되지 않습니다.

    WWDC 2013에서 대화식 전환과 관련하여 발표자는 이름 viewWillAppear을 " viewMightAppear, 또는 viewWillProbablyAppear, 또는 iReallyWishThisViewWouldAppear"로 바꾸어야한다고 농담했습니다 .

    내장 대화식 ​​제스처의 예는 a를 사용하고 UINavigationController"왼쪽 가장자리에서 스 와이프"하여보기 팝업을 시작하는 경우입니다. 는 viewWillAppear당신이 진열되는 뷰를 위해 호출됩니다,하지만 당신은이 팝업 제스처를 시작한에서보기로 다시 돌아가 그 "왼쪽 가장자리에서 슬쩍"취소하면 팝업이 취소되고이 viewDidAppear보기에 대해 당신은에 시작 다시 전화하지 않을 것입니다.

    이것의 결과는 호출 할 때마다 호출 할 viewWillAppear것이라고 가정하는 코드를 작성하지 않도록주의해야한다는 것 viewDidAppear입니다. 전환이 취소 된 경우에는 해당되지 않습니다.


5

뷰를로드하기 전에 viewwillappear가 호출되어 뷰를로드하기 전에 특정 작업을 수행 할 수 있으며 뷰를로드 한 후 viewdidappear가 호출되므로 포스트 태스크가 해당 메소드에서 수행됩니다.


4

"will"과 "did"의 차이점 ... 이름에서 알 수 있듯이 view가 나타나기 전에 viewWillAppear가 호출되고 view가 나타날 때 viewDidAppear가 호출됩니다.


70 개 이상의 공감대가 포함 된 허용 된 답변 형제를보십시오. :)
PJR

4

1) ViewWillAppear : 메모리에 실제로로드 된 뷰로, 뷰 컨트롤러에서 한 번 호출되고 프레임이 있었지만 여전히 사용자에게는 나타나지 않았습니다.

2) ViewDidAppear : 컨트롤러가 뷰 계층에 추가되어 다음 컨트롤러에 표시 할 수 있으며 뷰는 하위 뷰를 레이아웃했습니다.



3

요약하면 :

-viewWillAppear-> 데이터 업데이트 (테이블보기에서 데이터 다시로드)

-viewDidAppear-> 고가의 작업 (좋은 진행률을 가진 API 호출!)


1

이름에서 알 수 있듯이 viewWillAppear뷰가 나타나기 전에 viewDidAppear가 호출되고 뷰가 나타날 때 호출됩니다.


0

유스 케이스 , 즉 언제 사용해야합니까?

viewDidLoad -레이블, 버튼 (즉, 모든 컨트롤 / 하위 뷰)이 View의 인터페이스 파일에 연결되어 있고 ViewController의 View와 동시에 모든 파일을로드하려는 경우 및이를 메모리에 한 번로드하고 싶다면 그것으로 완료

viewWillAppear-viewController가 화면에 나타날 때마다보기의 배경색을 변경하고 싶습니다. 또는 낮 시간에 DarkMode 배경색을 사용하고 낮 시간에 배경보기의 밝은 색을 원한다면이 코드로 이동하십시오.viewWillAppear

여기에 또 다른 좋은 유스 케이스 https://stackoverflow.com/a/39395865/5438240

또한 Navigation 스택 ( UINavigationController)을 사용하는 경우 팝업 될 viewController viewWillDisappear()viewWillAppear()호출 되고 스택 맨 위에있는 ViewController가 호출됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.