UitableViewController 하위 클래스를 재정의 할 초기화 제
-
09-09-2019 - |
문제
나는있다 UITableViewController
사용되는 위치, NIB 또는 코드를 통해 인스턴스화 된 서브 클래스. 두 경우 모두 이니셜 라이저 메소드에서 사용자 정의를하고 싶습니다. 그것은 내가 둘 다 구현해야한다는 것을 의미합니까? initWithNibName:bundle:
그리고 initWithCoder:
, 그리고 각 방법이 각각의 슈퍼 이니셜 라이저를 호출할까요?
지금은 이것을 필요로하지 않지만 View Controller를 initWithStyle:
? 그런 다음 동일한 동작을 복제하는 3 개의 다른 Init 메소드가 필요합니까?
이는 공통 초기 메소드를 호출하지 않는 3 개의 별도의 이니셜 라이더가 있기 때문에 지정된 초기 초기화 규칙을 위반하는 것처럼 보입니다. 아니면 3 가지 다른 인스턴트 경로를 지원하면서 공통 지정된 이니셜 라이저를 만들 수있는 방법이 있습니까?
해결책
내 혼란은 각 클래스에 단일 지정 초기화기가 있어야한다는 잘못된 믿음에 근거했습니다. 이것은 사실이 아니며 UITableViewController
3 개의 지정된 초기화기가 있습니다 (내가 알 수있는 한) :
initWithStyle:
로컬로 선언했습니다initWithNibName:bundle:
상속UIViewController
initWithCoder:
입양에서NSCoding
규약
1을 무시해야합니다 이상 서브 클래스의 하위 클래스가 어떻게 인스턴스화되는지에 따라 이들 중에 이들은 이들 중 하나입니다. 필자의 경우 클래스를 NIB에서로드하거나 NIB를 참조하여 코드를 통해 인스턴스화 할 수 있으므로 #2와 #3을 구현해야했습니다. (둘 다 사용하는 것은 드문 일이라고 생각합니다. initWithStyle:
그리고 initWithNibName:bundle:
단일 수업의 경우.)
나는 애플을 찾았다 코코아에 대한 코딩 지침 도움이 되는.
다른 팁
내부적으로
- UitableViewController 's
-initWithStyle:
슈퍼를 호출합니다-init
그런 다음 설정하십시오_tableViewStyle
이바. - uiviewController 's
-init
단순히 전화-initWithNibName:bundle:
기본 인수와 함께. - UitableViewController 하지 않습니다 우세하다
-initWithNibName:bundle:
.
따라서 재정의하는 경우 -initWithNibName:bundle:
그 다음에 -initWithStyle:
변화도 채택 할 것입니다. 물론, 안전을 플레이하려면 (구현 세부 정보에 의존해서는 안되기 때문에) 두 가지를 무시하십시오.
(그리고 무시할 필요가 없습니다 -initWithCoder:
인스턴스를 UN/보관하지 않는 한.)
명확히하기 위해 initWithStyle:
, 존재 UITableViewController
문서에 게시 된 이니셜 라이저는 명시 적으로 지정된 이니셜 라이저입니다.
initWithNibName:bundle:
UIViewController에서 상속되며 해당 클래스의 지정된 이니셜 라이저입니다. 따라서 코코아 가이드 라인에 따라 UITableViewController
~ 해야 하다 이 메소드를 재정의합니다 (구현하여). 그러나 이것은 지정된 이니셜 라이저로 만들지 않습니다. UITableViewController
.
initWithCoder:
당신이 지적했듯이, 암시 적으로 지정된 이니셜 라이저는 NSCoding
.
구현하다:
- (void) viewDidLoad
구성 요소 초기화를 수행하십시오.
뷰가 실제로 요청 될 때 초기화 만 수행 할 수 있다는 이점이 있습니다.
또는 모든 이니셜 라이더가 별도의 설정 메소드를 호출하십시오.
위의 게시물에 해당 참조 –InitWithCoder :
인터페이스 빌더를 통해 뷰 컨트롤러를 학부모에 추가 한 경우 (예 : 뷰 컨트롤러가 인터페이스 빌더의 탭 막대 컨트롤러에 연결된 경우) –initwithCoder를 재정의해야합니다.
(-initwithNibName은 프로그래밍 방식으로보기 컨트롤러를 작성할 때만 호출됩니다.)