2014-04-10 6 views
1

이것은 두 개의 viewcontroller 클래스와 하나의 viewcontroller가있는 스토리 보드가있는 간단한 앱입니다. ViewController 'Super'는 UIViewcontroller에서 상속 받고 loadView을 구현하고 다른보기 컨트롤러 인 'Sub'는 'Super'에서 상속됩니다. 스토리 보드의보기 컨트롤러 클래스는 'Sub'입니다. 코드에서storyboard에서 loadNibNamed했습니다.

: 스토리 보드 뷰 컨트롤러

@implementation SOSuperViewController 
- (void)loadView { 
    self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.view.backgroundColor = [UIColor redColor]; 
    NSLog(@"%@=> %@", NSStringFromClass([self superclass]), NSStringFromSelector(_cmd)); 
} 
@end 

@implementation SOSubViewController 
- (void)awakeFromNib { 
    //Outlets are lazy loaded so self.view it is not really set here 
    [super awakeFromNib]; 

    NSLog(@"%@=> %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); 
} 

@end 

클래스는 SOSubViewController이다. 앱을 실행할 때 'Sub'컨트롤러에서 awakeFromNib이 호출되고 나중에 'Super'컨트롤러에서 loadView이 호출 된 결과 'Super'에 -으로 설정된 화면이 빨간색으로 표시됩니다.

첫 번째 질문은 : 'Sub'가 스토리 보드에서보기를 가져 오도록 'Super'의 loadView을 피할 방법이 있습니까? 내가 구현하는 것이 스토리 보드 대신 xibs 사용

경우 - XIB 파일에서보기를 얻기 위해 '하위'에 loadView, 뭔가 같은 :

- (void)loadView { 
    self.view = [[[NSBundle mainBundle] loadNibNamed:@"SOView" owner:self options:nil] firstObject]; 
} 

하지만 사용 nib 파일의 이름을 알 수 없다 설정하면 스토리 보드 대신 나는 nibBundle 및 nibName 속성을 사용해야합니다 :

- (void)loadView { 
    if (self.nibBundle && self.nibName) { 
     [self.nibBundle loadNibNamed:self.nibName owner:self options:nil]; 
    } 
} 

하지만 그 충돌 :

2014-04-10 11:55:11.872 loadViewTest[8941:60b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/nlg/Library/Application Support/iPhone Simulator/7.1/Applications/E36DFC3A-4222-4CE4-A954-CC1C3891DCE1/loadViewTest.app> (loaded)' with name 'vXZ-lx-hvc-view-kh9-bI-dsS'' 
*** First throw call stack: 
(
    0 CoreFoundation      0x017ec1e4 __exceptionPreprocess + 180 
    1 libobjc.A.dylib      0x0156b8e5 objc_exception_throw + 44 
    2 CoreFoundation      0x017ebfbb +[NSException raise:format:] + 139 
    3 UIKit        0x004e0b7b -[UINib instantiateWithOwner:options:] + 951 
    4 UIKit        0x004e2ada -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 165 
    5 loadViewTest      0x00002cff -[SOSuperViewController loadView] + 319 
    6 UIKit        0x0034a0d3 -[UIViewController loadViewIfRequired] + 78 
    7 UIKit        0x0034a5d9 -[UIViewController view] + 35 
    8 UIKit        0x0026a267 -[UIWindow addRootViewControllerViewIfPossible] + 66 
    9 UIKit        0x0026a5ef -[UIWindow _setHidden:forced:] + 312 
    10 UIKit        0x0026a86b -[UIWindow _orderFrontWithoutMakingKey] + 49 
    11 UIKit        0x002753c8 -[UIWindow makeKeyAndVisible] + 65 
    12 UIKit        0x00225bc0 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 2097 
    13 UIKit        0x0022a667 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 824 
    14 UIKit        0x0023ef92 -[UIApplication handleEvent:withNewEvent:] + 3517 
    15 UIKit        0x0023f555 -[UIApplication sendEvent:] + 85 
    16 UIKit        0x0022c250 _UIApplicationHandleEvent + 683 
    17 GraphicsServices     0x037e1f02 _PurpleEventCallback + 776 
    18 GraphicsServices     0x037e1a0d PurpleEventCallback + 46 
    19 CoreFoundation      0x01767ca5 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53 
    20 CoreFoundation      0x017679db __CFRunLoopDoSource1 + 523 
    21 CoreFoundation      0x0179268c __CFRunLoopRun + 2156 
    22 CoreFoundation      0x017919d3 CFRunLoopRunSpecific + 467 
    23 CoreFoundation      0x017917eb CFRunLoopRunInMode + 123 
    24 UIKit        0x00229d9c -[UIApplication _run] + 840 
    25 UIKit        0x0022bf9b UIApplicationMain + 1225 
    26 loadViewTest      0x0000309d main + 141 
    27 libdyld.dylib      0x01e33701 start + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

두 번째 질문은 : xib 파일없이 스토리 보드를 사용하여 펜촉을로드 할 수 있습니까?

호기심으로, 방금 self.nibName 값이 storyboard # view-# object id의 viewcontroller에 대한 #object id 인 vXZ-lx-hvc-view-kh9-bI-dsS임을 확인했습니다. viewcontroller #에서 어떤 종류의 보이는 권리.

+0

체크 아웃이 : http://stackoverflow.com/questions/10885585/loading-a-nib-file-that-is-instantiated-

는 storybard 사용에서이 방법을 방법을 인스턴스화하려면 from-a-storyboard – iDeveloper

답변

3

수 없습니다.

loadNibName 귀하의 경우에는 SOView.xib이라는 펜촉을 넣어야합니다.

보기를로드하려는 경우 별도의 xib 파일로보기를 만들 수 있지만 스토리 보드를 처리 할 때는 UIViewController 만 추가합니다 (물론 사용자 정의보기가 포함될 수 있음).

[self.storyboard instantiateViewControllerWithIdentifier:@"myControllerID"]; 
+0

나는 이것이 실제로 질문에 언급 된 일반 xib 파일을 사용하여 수행 할 것이라고 알고 있습니다. 하지만 주요 문제는 스토리 보드에서로드 된 뷰가 이미 있고 nibBundle 및 nibName이 채워진 것처럼 보이면 xib에 대해 이전에 사용한 것과 같은 방법을 사용할 수없는 이유는 무엇입니까? 또한 하위 클래스의 컨트롤러가 스토리 보드에 있지만 super의 loadView가 호출되는 이유는 무엇입니까? 또한보기 컨트롤러는 이미 앱 자체에서 인스턴스화되었습니다. – Nextorlg

+0

그래, 그 이유는 알 수 없다. 왜 애플이 스토리 보드를 사용하여 컨트롤러 만 인스턴스화하고 싶다고 생각하고, 뷰를 다루고 싶다면 xib를 만들 수있는 선택의 여지가 없다. 내 컨트롤러에서 스토리 뷰로 내 의견을 만듭니다. 그러나보기가 두 번 사용되면 xib에 넣고 중복 된보기 (스토리 보드에서도)는 코드를 유지하면서 문제를 일으킬 수 있습니다. HTH –

관련 문제