source

iOS UIView 컨트롤러의 라이프 사이클을 이해하려고 합니다.

lovecheck 2023. 4. 12. 22:29
반응형

iOS UIView 컨트롤러의 라이프 사이클을 이해하려고 합니다.

관리 방법을 가르쳐 ?UIViewController★★★★★★★★★★★★★★★★★?

.Initialize,ViewDidLoad,ViewWillAppear,ViewDidAppear,ViewWillDisappear,ViewDidDisappear,ViewDidUnload ★★★★★★★★★★★★★★★★★」Dispose 노 methods methods methods methods methods methods methods methods methods 。UIViewController를 누릅니다

이러한 모든 명령은 보기 컨트롤러를 로드/표시/숨길 때 iOS에 의해 적절한 시점에 자동으로 호출됩니다.이 .UIViewController UIView자기 자신입니다.은 그냥 수 없습니다.UIView.

여기 Apple 사이트에 훌륭한 문서가 있습니다.간단히 말하면 다음과 같습니다.

  • ViewDidLoad xib에서 로드됩니다.초기 셋업 및 일회성 작업에 최적.

  • ViewWillAppear가 표시되기 조작을 숨기거나 할 수 뷰 、 - 、 - 、 시 、 시 、 - 、 - 、 - 、 - - 、 。보기 사이를 왔다 갔다 할 수 있기 때문에 보기가 화면에 나타나려고 할 때마다 이 값이 호출됩니다.

  • ViewDidAppear뜨면 하거나 외부 API에서 호출합니다

  • ViewWillDisappear/DidDisappear - ★★★★★★★★★★★★★★★★★★★.ViewWillAppear/ViewDidAppear.

  • ViewDidUnload/ViewDidDispose서 이루어지지만, 에 여기서 없습니다.- Objective-C는 청소와 해제를 할 필요가 .

업데이트: ViewDidUnload는 iOS 6에서 더 이상 사용되지 않으므로 그에 따라 답변을 업데이트했습니다.

UIViewController의 라이프 사이클은 다음과 같습니다.

뷰 컨트롤러의 라이프 사이클, 다이어그램

Xamarin Native/Mono Touch를 사용하면 네이티브 API를 사용하기 때문에 Apple의 Documentation과 동일한 View Controller 라이프 사이클을 사용할 수 있습니다.

최신 iOS 버전(Xcode 9.3, Swift 4.1로 수정됨)용입니다.아래는 의 라이프 사이클을 만드는 모든 단계입니다.UIViewController성하하다

  • loadView()

  • loadViewIfNeeded()

  • viewDidLoad()

  • viewWillAppear(_ animated: Bool)

  • viewWillLayoutSubviews()

  • viewDidLayoutSubviews()

  • viewDidAppear(_ animated: Bool)

  • viewWillDisappear(_ animated: Bool)

  • viewDidDisappear(_ animated: Bool)

그 모든 단계를 설명하겠습니다.

1. loadView

이 이벤트는 컨트롤러가 관리하는 뷰를 작성/로드합니다.빈 nib 파일에서 할 수 .UIView.이를 통해 프로그래밍 방식으로 코드로 보기를 만들 수 있습니다.

하위 클래스가 니브를 사용하지 않는 경우 여기서 사용자 정의 뷰 계층을 만들어야 합니다.직접 전화해서는 안 됩니다.는 프로그래밍 .view속성 loadView를 재정의할 때 슈퍼 메서드를 호출하지 않음

2. loadViewIfNeeded

의 「의 경우.viewController아직 설정되지 않은 경우 이 메서드는 보기를 로드하지만 iOS > = 9.0에서만 사용할 수 있습니다.따라서 iOS <9.0을 지원하는 경우, 이 제품이 등장할 것으로 예상하지 마십시오.

뷰 컨트롤러의 뷰를 아직 설정하지 않은 경우 로드합니다.

3. viewDidLoad

viewDidLoad이벤트는 뷰가 생성되어 메모리에 로드될 때만 호출되지만 뷰의 경계가 아직 정의되지 않았습니다.뷰 컨트롤러가 사용하는 오브젝트를 초기화하기 좋은 장소입니다.

뷰가 로드된 후에 호출됩니다.코드로 작성된 뷰 컨트롤러의 경우 -loadView 이후입니다.니브에서 아카이브되지 않은 뷰 컨트롤러의 경우 뷰가 설정된 후입니다.

4. viewWillAppear

는 에 .viewController뷰가 화면에 나타날 때마다 표시됩니다.이 단계에서는 뷰에 정의된 경계가 있지만 방향이 설정되지 않습니다.

보기를 표시하려고 하면 호출됩니다.디폴트로는 아무것도 할 수 없습니다.

5. viewWillLayoutSubviews

이것은 경계가 확정되는 라이프사이클의 첫 번째 단계이다.구속조건 또는 자동 레이아웃을 사용하지 않는 경우 여기서 하위 보기를 업데이트해야 할 수 있습니다.이것은 iOS > = 5.0에서만 사용할 수 있습니다.따라서 iOS <5.0을 지원하는 경우 문제가 발생할 것으로 예상하지 마십시오.

뷰 컨트롤러 뷰의 layoutSubviews 메서드가 호출되기 직전에 호출됩니다.서브클래스는 필요에 따라 구현할 수 있습니다.기본값은 nop 입니다.

6. viewDidLayoutSubviews

이 이벤트는 뷰 컨트롤러에 서브뷰가 설정되었음을 알립니다.서브뷰 설정 후 서브뷰를 변경할 수 있습니다.이것은 iOS > = 5.0에서만 사용할 수 있습니다.따라서 iOS <5.0을 지원하는 경우 문제가 발생할 것으로 예상하지 마십시오.

뷰 컨트롤러 뷰의 layoutSubviews 메서드가 호출된 직후에 호출됩니다.서브클래스는 필요에 따라 구현할 수 있습니다.기본값은 nop 입니다.

7. viewDidAppear

viewDidAppear화면에 뷰가 표시된 후 이벤트가 발생합니다.따라서 백엔드 서비스 또는 데이터베이스에서 데이터를 가져오는 것이 좋습니다.

뷰가 화면으로 완전히 전환되면 호출됩니다.디폴트로는 아무것도 할 수 없다

8. viewWillDisappear

viewWillDisappear에서는 제시된 되었을 때 됩니다.viewController 한다, 없어지려 , , , 숨는다, 숨는다, 숨는다, 숨는다, 숨는다, 숨는다, 숨는다, 숨는다, 숨는다, 숨는다, 숨는다, 숨는다, 숨는다, 숨는다, 숨는다, 숨는다, 숨는다, 숨는다, 숨는다, , 숨는다, 숨는다, 숨는다, 숨는다, 숨는다viewController콜을 하거나 해당 할 수 좋은 장소입니다.viewController.

뷰가 해제되거나 커버되거나 숨겨질 때 호출됩니다.

9. viewDidDisappear

은, 이 가, 제시된 「」의 하기 때문에, 할 수 입니다.viewController사라지거나, 무시되거나, 가려지거나, 숨겨집니다.

뷰가 해제, 커버 또는 숨겨진 후에 호출됩니다.디폴트로는 아무것도 할 수 없다

Apple에 따르면 이 방법을 구현할 때 잊지 말고super그 특정 방법의 구현.

UIViewController 서브클래스를 사용하는 경우 NIB를 사용하지 않더라도 이 메서드의 슈퍼 실장을 호출해야 합니다(편의상 디폴트 init 메서드가 이를 수행하며 두 메서드 인수 모두에 대해 0을 지정합니다).지정된 NIB에서 파일의 소유자 프록시는 뷰 콘센트가 기본 뷰에 연결된 상태에서 뷰 컨트롤러 하위 클래스로 클래스를 설정해야 합니다.이름으로 하면 이 nil nib가 됩니다.-loadView메서드는 뷰 컨트롤러의 클래스와 이름이 같은 NIB를 로드하려고 시도합니다.하지 않는 는, 「NIB」를 호출할 필요가 .-setView: 전에-view.-loadView프로그래밍 방식으로 보기를 설정하는 방법.

도움이 됐으면 좋겠네요.감사해요.

업데이트 - @ThomasW가 내부 코멘트를 지적한 대로viewWillLayoutSubviews ★★★★★★★★★★★★★★★★★」viewDidLayoutSubviews테이블 뷰 또는 컬렉션뷰의 셀이 로드된 경우 등 메인뷰의 서브뷰가 로드된 경우에도 호출됩니다.

UPDATE - @Maria가 내부 코멘트를 지적한 바와 같이,loadView 되었습니다.

iOS 10,11 (Swift 3.1, Swift 4.0)

★★★★★★★에 의하면UIViewControllerUIKit 회사,

1. loadView()

하위 클래스가 니브를 사용하지 않는 경우 여기서 사용자 정의 뷰 계층을 만들어야 합니다.직접 전화해서는 안 됩니다.

2. load뷰If Needed()

뷰 컨트롤러의 뷰를 아직 설정하지 않은 경우 로드합니다.

3. view Did Load()

뷰가 로드된 후에 호출됩니다.코드로 작성된 뷰 컨트롤러의 경우 -loadView 이후입니다.니브에서 아카이브되지 않은 뷰 컨트롤러의 경우 뷰가 설정된 후입니다.

4. viewAple(_애니메이션):부울)

보기를 표시하려고 하면 호출됩니다.디폴트로는 아무것도 할 수 없다

5. view Will Layout Subviews()

뷰 컨트롤러 뷰의 layoutSubviews 메서드가 호출되기 직전에 호출됩니다.서브클래스는 필요에 따라 구현할 수 있습니다.디폴트로는 아무것도 할 수 없습니다.

6. viewDidLayoutSubviews()

뷰 컨트롤러 뷰의 layoutSubviews 메서드가 호출된 직후에 호출됩니다.서브클래스는 필요에 따라 구현할 수 있습니다.디폴트로는 아무것도 할 수 없습니다.

7. viewDidAple(_애니메이션):부울)

뷰가 화면으로 완전히 전환되면 호출됩니다.디폴트로는 아무것도 할 수 없다

8. viewWillDisplay(_ 애니메이션:부울)

뷰가 해제되거나 커버되거나 숨겨질 때 호출됩니다.디폴트로는 아무것도 할 수 없다

9. viewDisdelete(_애니메이션: 부울)

뷰가 해제, 커버 또는 숨겨진 후에 호출됩니다.디폴트로는 아무것도 할 수 없다

10. viewWillTransition (사이즈: CGSize, 코디네이터 포함):UIView 컨트롤러 전환 코디네이터)

뷰가 Transitioning일 때 호출됩니다.

11. 이동한다(ParentViewController 부모:UIView컨트롤러)

12. did Move(Parent View Controller 부모로):UIView컨트롤러)

이들 2개의 메서드는 하위 컨트롤러 간에 이행할 때 컨테이너 서브클래스가 호출할 수 있도록 공개되어 있습니다.오버라이드가 되어 있는 경우 오버라이드는 반드시 슈퍼를 호출해야 합니다.

두 메서드의 parent 인수는 자녀가 부모에서 삭제될 때 0이 됩니다.그렇지 않으면 새로운 부모 뷰 컨트롤러와 동일합니다.

13. did Receive Memory Warning()

부모 응용 프로그램이 메모리 경고를 수신하면 호출됩니다.iOS 6.0에서는 기본적으로 보기가 지워지지 않습니다.

iOS 6 이후.새로운 그림은 다음과 같습니다.

여기에 이미지 설명 입력

이제 UIViewController의 라이프 사이클을 담당하는 방법에 대해 살펴보겠습니다.

  • 작성:

    - (void)init

    - (void)initWithNibName:

  • 보기 생성:

    - (BOOL)isViewLoaded

    - (void)loadView

    - (void)viewDidLoad

    - (UIView *)initWithFrame:(CGRect)frame

    - (UIView *)initWithCoder:(NSCoder *)coder

  • 뷰 상태 변경 처리:

    - (void)viewDidLoad

    - (void)viewWillAppear:(BOOL)animated

    - (void)viewDidAppear:(BOOL)animated

    - (void)viewWillDisappear:(BOOL)animated

    - (void)viewDidDisappear:(BOOL)animated

    - (void)viewDidUnload

  • 메모리 경고 처리:

    - (void)didReceiveMemoryWarning

  • 할당 해제

    - (void)viewDidUnload

    - (void)dealloc

UIView Controller의 라이프 사이클 다이어그램

상세한 것에 대하여는, 「UIViewController Class Reference」를 참조해 주세요.

「」viewWillLayoutSubviews ★★★★★★★★★★★★★★★★★」viewDidLayoutSubviews 있지 않지만,을 '아까부터' '아까부터' '아까부터' '아까부터' '아까부터' '아까부터' '아까부터' '아까부터' '아까부터' '아까부터' '아까부터' '아까부터' '아까'viewWillAppear ★★★★★★★★★★★★★★★★★」viewDidAppear여러 번 호출할 수 있습니다.

Haider의 답변은 iOS 6 이전 버전에서는 맞지만 iOS 6에서는 viewDidUnload 및 viewWillUnload가 호출되지 않습니다.docs 상태: "메모리가 적은 상태에서는 뷰가 삭제되지 않으므로 이 메서드는 호출되지 않습니다."

여기에는 낡고 불완전한 정보가 많이 있습니다.iOS 6 이후에만 해당:

  1. loadView[a]
  2. viewDidLoad[a]
  3. viewWillAppear
  4. viewWillLayoutSubviews되는 것입니다.
  5. viewDidLayoutSubviews
  6. viewDidAppear
  7. * viewWillLayoutSubviews[b]
  8. * viewDidLayoutSubviews[b]

각주:

(a) - 다음 중 보기를 수동으로 지우는 경우didReceiveMemoryWarning,loadView ★★★★★★★★★★★★★★★★★」viewDidLoad시시시호호호다다로는 「」입니다.loadView ★★★★★★★★★★★★★★★★★」viewDidLoad는 뷰 컨트롤러 인스턴스별로 1회만 호출됩니다.

(b) 추가 0회 이상이라고 할 수 있다.

공식 문서에서 상태 변화에 대해 설명합니다.https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/index.html

이 이미지는 다양한 보기 'will' 및 'did' 콜백 메서드 간의 유효한 상태 전환을 보여 줍니다.

유효한 상태 전환:


출처: https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Art/UIViewController Class Reference_2x.png

애플의 문서에 따르면 iOS(Swift) 개발을 시작합니다.View 컨트롤러와의 연계 - View 컨트롤러의 라이프 사이클을 이해합니다.

viewDidLoad() 합니다.… 이 방법을 사용하여 뷰 컨트롤러에 필요한 추가 설정을 수행합니다.

viewWillAppear(): 의 뷰 뷰 컨트롤러의 콘텐츠 보기가 앱의 뷰 계층에 추가되기 직전에 호출됩니다.에 표시되기 에 발생하는 조작을 , 이 합니다.

viewDidAppear(): 뷰 계층에 뷰 컨트롤러의 콘텐츠 보기가 앱의 뷰 계층에 추가된 직후에 호출됩니다.이 방법을 사용하면 데이터 가져오기 또는 애니메이션 표시와 같이 보기가 화면에 표시되는 즉시 발생해야 하는 작업을 트리거할 수 있습니다.

viewWillDisappear(): 뷰 뷰 컨트롤러의 콘텐츠 보기가 앱의 뷰 계층에서 삭제되기 직전에 호출됩니다.이 방법을 사용하여 변경 커밋 또는 최초 응답자 상태 재서명 등의 청소 작업을 수행합니다.

viewDidDisappear() 뷰 컨트롤러의 콘텐츠 보기가 앱의 뷰 계층에서 제거된 직후에 호출됩니다.이 방법을 사용하여 추가 해체 작업을 수행합니다.

언급URL : https://stackoverflow.com/questions/5562938/looking-to-understand-the-ios-uiviewcontroller-lifecycle

반응형