Programming

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

procodes 2020. 6. 30. 21:26
반응형

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


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


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

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

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

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


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

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

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

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


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

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


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


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


몇 가지 관찰 :

  • 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보기에 대해 당신은에 시작 다시 전화하지 않을 것입니다.

    The net effect of this is that you should be careful that you don't write code that assumes that every call to viewWillAppear will be followed eventually by a call to viewDidAppear. If the transition is canceled, this will not be the case.


Difference between "will" and "did"...As the name suggests the viewWillAppear is called before the view is about to appear and viewDidAppear is called when view did appear.


1) ViewWillAppear: The view loaded actually in the memory, called once in the view controller and had its frame, but still didn't appear to the user

2) ViewDidAppear: The controller added to the view hierarchy, so you could present to the next controller, also, the view did layout the subviews


The former happens before the view appears and the latter happens afterwards.


To sum up:

-viewWillAppear -> update data (reload data from a table view)

-viewDidAppear -> expensive operations (API call with a nice progress hud!)


As the name suggests the viewWillAppear is called before the view is about to appear and viewDidAppear is called when view did appear.


Usecase, i.e when should I use which ?

viewDidLoad - when labels, buttons(i,e any controls/subviews) are connected to the View's interface file and if you want to load all these at the same time as the ViewController's View, and if you want to load this into memory once and be done with it

viewWillAppear - say, you want to change the background color of the view everytime the viewController appears on the screen. Or more realistically if you want DarkMode background color at night time of the day, and light color of the background view during day time, go for this code in viewWillAppear

Another good usecase here https://stackoverflow.com/a/39395865/5438240

Also note that , if you are using a Navigation stack(UINavigationController), the viewController that is about to be popped has the viewWillDisappear() called, and the ViewController that will next be on top of the stack will have viewWillAppear() called

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

반응형