UIViewController
라이프 사이클 을 관리하는 올바른 방법을 설명해 주 시겠습니까?
특히, 내가 사용하는 방법을 알고 싶습니다 Initialize
, ViewDidLoad
, ViewWillAppear
, ViewDidAppear
, ViewWillDisappear
, ViewDidDisappear
, ViewDidUnload
및 Dispose
A의 모노 터치의 메소드 UIViewController
클래스입니다.
UIViewController
라이프 사이클 을 관리하는 올바른 방법을 설명해 주 시겠습니까?
특히, 내가 사용하는 방법을 알고 싶습니다 Initialize
, ViewDidLoad
, ViewWillAppear
, ViewDidAppear
, ViewWillDisappear
, ViewDidDisappear
, ViewDidUnload
및 Dispose
A의 모노 터치의 메소드 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 설명서에서 볼 수있는 것과 동일한 ViewController 수명주기를 따릅니다.
최신 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
null이 발견되면 비어 있을 수 있습니다. 이렇게하면 프로그래밍 방식으로 코드로 뷰를 만들 수 있습니다.
하위 클래스가 펜촉을 사용하지 않는 경우 사용자 정의 뷰 계층 구조를 만들어야하는 곳입니다. 직접 호출해서는 안됩니다. 프로그래밍 방식으로 뷰를 만들고 루트 뷰를
view
속성에 할당 할 때만이 메서드 를 재정의하십시오. loadView 를 재정의 할 때 수퍼 메서드를 호출하지 마십시오.
2. loadViewIfNeeded
현재의보기가 viewController
아직 설정되지 않은 경우이 방법은보기를로드하지만 기억하십시오. 이는 iOS> = 9.0에서만 사용할 수 있습니다. 따라서 iOS <9.0을 지원하는 경우 iOS가 그림에 올 것으로 기대하지 마십시오.
뷰 컨트롤러의 뷰가 아직 설정되지 않은 경우로드합니다.
삼. viewDidLoad
이 viewDidLoad
이벤트는 뷰가 생성되어 메모리에로드 될 때만 호출되지만 뷰의 경계는 아직 정의되지 않았습니다. 뷰 컨트롤러가 사용할 객체를 초기화하기에 좋은 곳입니다.
뷰가로드 된 후 호출됩니다. 코드로 작성된 뷰 컨트롤러의 경우 -loadView 이후입니다. 펜촉에서 아카이브되지 않은 뷰 컨트롤러의 경우 뷰가 설정된 후입니다.
4. viewWillAppear
이 이벤트 viewController
는 화면에보기가 나타날 때마다 알려줍니다 . 이 단계에서는보기에 정의 된 경계가 있지만 방향이 설정되지 않았습니다.
뷰가 표시 될 때 호출됩니다. 기본은 아무 것도하지 않습니다.
5. viewWillLayoutSubviews
이는 수명주기의 첫 번째 단계로 한계가 확정됩니다. 구속 조건 또는 자동 레이아웃을 사용하지 않는 경우 여기에서 하위보기를 업데이트 할 수 있습니다. iOS> = 5.0에서만 사용할 수 있습니다. 따라서 iOS <5.0을 지원하는 경우 iOS가 그림에 올 것으로 기대하지 마십시오.
뷰 컨트롤러의 뷰의 layoutSubviews 메소드가 호출되기 직전에 호출됩니다. 서브 클래스는 필요에 따라 구현할 수 있습니다. 기본값은 nop입니다.
6. viewDidLayoutSubviews
이 이벤트는 뷰 컨트롤러에 하위 뷰가 설정되었음을 알립니다. 서브 뷰를 설정 한 후에 변경하는 것이 좋습니다. iOS> = 5.0에서만 사용할 수 있습니다. 따라서 iOS <5.0을 지원하는 경우 iOS가 그림에 올 것으로 기대하지 마십시오.
뷰 컨트롤러의 view의 layoutSubviews 메소드가 호출 된 직후에 호출됩니다. 서브 클래스는 필요에 따라 구현할 수 있습니다. 기본값은 nop입니다.
7. viewDidAppear
viewDidAppear
보기 후 이벤트가 발생이 화면에 표시됩니다. 백엔드 서비스 또는 데이터베이스에서 데이터를 얻는 것이 좋은 장소입니다.
뷰가 화면으로 완전히 전환되면 호출됩니다. 기본은 아무것도하지 않습니다
8. viewWillDisappear
이 viewWillDisappear
행사는 제시된 견해 viewController
가 사라지거나, 사라지거나, 가리거나 숨기려고 할 때 발생 viewController
한다 이것은 네트워크 호출을 제한하거나 타이머를 무효화하거나 그에 바인딩 된 객체를 해제 할 수있는 좋은 장소입니다 viewController
.
뷰가 닫히거나 닫히거나 숨겨 질 때 호출됩니다.
9. viewDidDisappear
제시된보기 viewController
가 사라지거나 숨겨 지거나 숨겨 지 자마자이 이벤트가 시작될 때 누구나 처리 할 수있는 수명주기의 마지막 단계입니다 .
뷰가 닫히거나 숨겨 지거나 숨겨진 후에 호출됩니다. 기본은 아무것도하지 않습니다
이제이 메소드를 구현할 때 Applesuper
에 따라 해당 특정 메소드의 구현 을 호출해야합니다 .
UIViewController를 서브 클래 싱하는 경우 NIB를 사용하지 않더라도이 메소드의 수퍼 구현을 호출해야합니다. 편의상 기본 init 메소드가이를 수행하고이 두 메소드 인수 모두에 대해 nil을 지정합니다. 지정된 NIB에서 파일의 소유자 프록시는 뷰 콘센트가있는 뷰 컨트롤러 서브 클래스로 클래스를 설정해야합니다. 기본보기에 연결되어 있습니다. nil nib 이름으로이 메소드를 호출하면이 클래스의
-loadView
메소드는 이름이 뷰 컨트롤러의 클래스와 동일한 NIB를로드하려고 시도합니다. 그러한 NIB가 실제로 존재하지 않으면 호출-setView:
하기 전에-view
호출하거나-loadView
메소드를 대체 하여보기를 프로그래밍 방식으로 설정해야합니다.
이것이 도움이 되었기를 바랍니다. 감사.
UPDATE는 -로 @ThomasW 코멘트 안에 지적 viewWillLayoutSubviews
하고 viewDidLayoutSubviews
주 화면의 파단이로드 된 경우 테이블보기 또는 콜렉션 뷰의 세포가로드 될 때 또한 예를 들어, 다른 시간에 호출됩니다.
업데이트 -@Maria가 주석 내에서 지적한 것처럼 설명 loadView
이 업데이트되었습니다.
viewWillLayoutSubviews
및 viewDidLayoutSubviews
메인 뷰의 파단이로드 된 경우 테이블 뷰 또는 뷰 컬렉션의 셀이로드 된 경우에도, 예를 들어, 다른 시간에 호출된다.
viewWillAppear
viewDidAppear
viewDidDisappear
. 어느 시점에서 super를 호출해야합니다.
iOS 10,11 (Swift 3.1, Swift 4.0)
에 따르면 UIViewController
의 UIKit
개발자,
1. loadView ()
서브 클래스가 펜촉을 사용하지 않는 경우 사용자 정의보기 계층 구조를 만들어야하는 곳입니다. 입니다. 직접 호출해서는 안됩니다.
2. loadViewIfNeeded ()
뷰 컨트롤러의 뷰가 아직 설정되지 않은 경우로드합니다.
3. viewDidLoad ()
뷰가로드 된 후 호출됩니다. 코드로 작성된 뷰 컨트롤러의 경우 -loadView 이후입니다. 펜촉에서 아카이브되지 않은 뷰 컨트롤러의 경우 뷰가 설정된 후입니다.
4. viewWillAppear (_ 애니메이션 : Bool)
뷰가 표시 될 때 호출됩니다. 기본은 아무것도하지 않습니다
5. viewWillLayoutSubviews ()
뷰 컨트롤러의 뷰의 layoutSubviews 메소드가 호출되기 직전에 호출됩니다. 서브 클래스는 필요에 따라 구현할 수 있습니다. 기본은 아무 것도하지 않습니다.
6. viewDidLayoutSubviews ()
뷰 컨트롤러의 view의 layoutSubviews 메소드가 호출 된 직후에 호출됩니다. 서브 클래스는 필요에 따라 구현할 수 있습니다. 기본은 아무 것도하지 않습니다.
7. viewDidAppear (_ 애니메이션 : Bool)
뷰가 화면으로 완전히 전환되면 호출됩니다. 기본은 아무것도하지 않습니다
8. viewWillDisappear (_ animated : Bool)
뷰가 닫히거나 닫히거나 숨겨 질 때 호출됩니다. 기본은 아무것도하지 않습니다
9. viewDidDisappear (_ 애니메이션 : Bool )
뷰가 닫히거나 숨겨 지거나 숨겨진 후에 호출됩니다. 기본은 아무것도하지 않습니다
10. viewWillTransition (크기 : CGSize, 조정자 포함 : UIViewControllerTransitionCoordinator)
뷰가 전환 중일 때 호출됩니다.
11. willMove (toParentViewController 상위 : UIViewController?)
12. didMove (toParentViewController 상위 : UIViewController?)
이 두 가지 메소드는 하위 제어기간에 전환 할 때 컨테이너 서브 클래스가 호출 할 수 있도록 공용입니다. 재정의 된 경우 재정의를 통해 수퍼를 호출해야합니다.
이 두 가지 방법 모두에서 부모 인수는 자식이 부모에서 제거 될 때 0이 아닙니다. 그렇지 않으면 새 상위 뷰 컨트롤러와 같습니다.
13. didReceiveMemoryWarning ()
부모 응용 프로그램이 메모리 경고를 받으면 호출됩니다. iOS 6.0에서는 더 이상 기본적으로보기를 지우지 않습니다.
nib
아래에 언급 된 바와 같이 무엇입니까 loadView
?
viewWillLayoutSubviews()
의 ViewController의 뷰 객체가 호출되기 전에 호출되는 layoutSubviews()
방법
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
자세한 내용은 UIViewController 클래스 참조를 참조하십시오 .
Haider의 답변은 iOS 6 이전에는 정확합니다. 그러나 iOS 6부터 viewDidUnload 및 viewWillUnload는 호출되지 않습니다. 문서의 상태가 "조회수는 더 이상 메모리 부족 조건에서이 메소드가 호출되지 않도록 제거되지 않습니다."
오래되고 불완전한 정보가 많이 있습니다. 들어 아이폰 OS 6 새로운 전용 :
loadView
[ㅏ]viewDidLoad
[ㅏ]viewWillAppear
viewWillLayoutSubviews
한계가 확정 된 것은 처음이다viewDidLayoutSubviews
viewDidAppear
*
viewWillLayoutSubviews
[비]*
viewDidLayoutSubviews
[비]각주 :
(A) - 수동 동안보기를 nil을 경우 didReceiveMemoryWarning
, loadView
그리고 viewDidLoad
다시 호출됩니다. 즉 기본적으로,이다 loadView
와 viewDidLoad
전용 뷰 컨트롤러 인스턴스 당 한 번 호출됩니다.
(b) 추가로 0 회 이상 호출 될 수 있습니다 .
viewWillLayoutSubviews
및 viewDidLayoutSubviews
메인 뷰의 파단이로드 된 경우 테이블 뷰 또는 뷰 컬렉션의 셀이로드 된 경우에도, 예를 들어, 다른 시간에 호출된다.
공식 문서에서 국가 전환 설명 : 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 클래스 Reference_2x.png
당으로 애플의 문서 - 뷰 컨트롤러와 함께 작동 - - 시작 IOS 애플 리케이션 (스위프트)를 개발보기 컨트롤러 라이프 사이클을 이해
viewDidLoad()
— 뷰 컨트롤러의 컨텐츠 뷰 (뷰 계층 구조의 맨 위)가 스토리 보드에서 만들어로드 될 때 호출됩니다. …이 방법을 사용하여 뷰 컨트롤러에 필요한 추가 설정을 수행하십시오.
viewWillAppear()
— 뷰 컨트롤러의 컨텐츠 뷰가 앱의 뷰 계층 구조에 추가되기 직전에 호출됩니다. 컨텐츠보기가 화면에 표시되기 전에 발생해야하는 작업을 트리거하려면이 방법을 사용하십시오.
viewDidAppear()
— 뷰 컨트롤러의 컨텐츠 뷰가 앱의 뷰 계층 구조에 추가 된 직후에 호출됩니다. 데이터 가져 오기 또는 애니메이션 표시와 같이보기가 화면에 표시되는 즉시 발생해야하는 작업을 트리거하려면이 방법을 사용하십시오.
viewWillDisappear()
— 뷰 컨트롤러의 컨텐츠 뷰가 앱의 뷰 계층에서 제거되기 직전에 호출됩니다. 변경 커밋 또는 첫 번째 응답자 상태 취소와 같은 정리 작업을 수행하려면이 방법을 사용하십시오.
viewDidDisappear()
— 뷰 컨트롤러의 컨텐츠 뷰가 앱의 뷰 계층에서 제거 된 직후에 호출됩니다. 이 방법을 사용하여 추가 분류 활동을 수행하십시오.