2010-02-08 10 views

답변

131

-initWithNibName:bundle:은 UIViewController의 지정된 초기화 프로그램입니다. 뭔가 결국 그것을 호출해야합니다. 즉, 애플의 예 (대부분의 경우 유지 관리 가능성을 강조하는 것)에도 불구하고 뷰 컨트롤러 외부에서 절대로 호출해서는 안됩니다.

당신은 종종 다음과 같은 코드가 표시됩니다

MYViewController *vc = [[MYViewController alloc] initWithNibName:@"Myview" bundle:nil]; 

내가이 올바르지 않습니다 말한다. 구현 세부 사항 (NIB의 이름과 NIB가 사용되었다는 사실)을 호출자에게 전달합니다. 캡슐화가 깨졌습니다. 이 작업을 수행하는 올바른 방법은 다음과 같습니다 그런

MYViewController *vc = [[MYViewController alloc] init]; 

, MYViewController에 :

- (instancetype)init 
{ 
    self = [super initWithNibName:@"Myview" bundle:nil]; 
    if (self != nil) 
    { 
     // Further initialization if needed 
    } 
    return self; 
} 

- (instancetype)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle 
{ 
    NSAssert(NO, @"Initialize with -init"); 
    return nil; 
} 

이 객체에 다시 키 구현 세부 사항을 이동하고, 실수로 캡슐화를 깨는에서 발신자를 방지 할 수 있습니다. 이제 NIB의 이름을 변경하거나 프로그래밍 방식으로 이동하면보기 컨트롤러가 사용되는 모든 장소가 아닌 한 곳에서 (보기 컨트롤러에서) 수정됩니다.

+3

에 선택한 답변을 변경해야합니다 그루터기를 모든 빈의 ViewController 클래스, 아직 초기화 방법에 대해? –

+1

클래스 앞에 접두사를 붙이기로되어 있어도 템플릿에 클래스 접두사가 포함되지 않은 것과 같은 이유가 있으며 템플릿은 응용 프로그램 대리인에게 가능한 가장 어둡지 않은 이름을 만듭니다. 이는 수정해야 할 두통입니다. IB는 새로운 ABI에서 ivars를 선언해서는 안되지만 속성을 자동 생성 할 때 ivar 선언을 강요합니다. 템플릿이 항상 최상의 방법은 아닙니다. 대부분의 경우에 다소 효과가있는 가장 일반적인 공통 분모 인 경우가 많지만 어디에서도 특히 잘 나타납니다. 최근 애플의 예제 코드가 개선되고 있지만 아직 갈 길이 멀다. –

+1

만약 당신이 nibs를 클래스와 똑같이 이름 짓는 관행을 따르면,이 코드는 잘 작동합니다.'- (id) init { return [super initWithNibName : NSStringFromClass ([self class]) 번들 : nil]; }' – CharlesA

6

nib 파일로 초기화하는 경우 initWithNibName을 사용하십시오! 즉, Interface Builder를 사용하여 만든 파일입니다.

IB를 사용하여 뷰를 레이아웃하지 않으면 init 만 사용할 수 있습니다.

0

nib/xib 파일이 없을 때 init을 사용합니다. UI는 우리가 1 개 이상 펜촉에 의해 펜촉/XIB 또는 동일한 컨트롤러 점유율이있는 경우, initWithNibName를 사용

코딩에 의해 생성/XIB는

내가 무슨 생각
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil]; 
} else { 
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil]; 
} 

..

+0

추가하면 당신은 알고 ~ 아이폰 또는 ~ 당신의 펜촉 이름은 그냥 "의 ViewController"@ initWithNibName를 호출 할 수 있고 올바른 하나를 선택합니다 아이 패드. – Darxval

2

당신은 할 수 있습니다 xib가 View Controller 클래스와 같은 이름을 가진 한 init을 호출하십시오. 캡슐화는 필요하지 않습니다. 이렇게하면 타이핑을 절약 할 수 있지만 선명도가 떨어질 수 있습니다. 번들 :

NUDMainViewController *mainVC = [[NUDMainViewController alloc] init]; 
관련 문제