0

나는 그것을 이해했다. 정보를 주셔서 감사합니다! :마지막으로 방문한 ViewController를 만드는 방법 RootViewController?

UIViewController* vc = (UIViewController*)[[UIStoryboard storyboardWithName:@"iPhone4" bundle:nil] instantiateViewControllerWithIdentifier:@"MyViewControllerIdentifier"]; 

if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"currentViewController"] isEqualToString:@"iPhone4Level1"]) 
{ 
    [self.window setRootViewController: vc]; 
} 
+0

충돌에 대한 자세한 내용을 제공하십시오. 어디서 발생합니까, 뭐라고 말합, 등 – shim

+0

내 코드가 맞습니까? @shim – MGames

+0

@shim NSLog에 대한 나의 편집을 참조하십시오. – MGames

답변

2

NSClassFromString을 통해 클래스를 초기화 할 수 없습니다. 클래스의 인스턴스를 반환하지 않으면 Class 객체를 반환합니다. 이 클래스는 클래스를 식별하는 데 도움이되는 Objective C 기능입니다. 루트보고 컨트롤러로 설정하려는 변수가보기 컨트롤러가 아니기 때문에보기 컨트롤러 메소드에 응답 할 수 없으므로이 오류가 발생합니다. 클래스는 자체 이니셜 라이저를 사용하여 초기화됩니다.

예 : 다른 이니셜 라이저를 사용하여 펜촉/스토리 보드를 사용하는 경우

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

또는 : 당신이 달성하기 위해 노력하고 무엇을 위해

MyViewController* vc = [[MyViewController alloc] initWithNibName: @"myNib" bundle: nil]; 

또는

MyViewController* vc = (MyViewController*)[[UIStoryboard storyboardWithName:@"MyStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"MyViewControllerIdentifier"]; 

을, 당신은해야합니다 저장 한 클래스를 기반으로로드 할 클래스를 파악하는 일부 논리.

예컨대 클래스 등, 서브 클래스 재사용 할 수 있기 때문에

Class c = NSSClassFromString(@"MyClass" 
if ([MyViewController class] == c) { 
    //load MyViewController, e.g. using init or instantiate from storyboard etc 
} 
else if ([MyOtherViewController class] == c){ 
    //load MyOtherViewController 
} 
//etc 

그러나, 식별자 (당신이 원하는대로 정수, 문자열,)와 같은 몇 가지 값을 정의하고 대신 클래스 이름의 사람을 저장 더 나을 수 있습니다 또한 앱의 모든 단일보기 컨트롤러 클래스가 허용되는 시작점이되기를 원치 않을 수도 있습니다. 그렇다면이 NSClassFromString 비즈니스를 피하고 간단한 switch 문이나 논리적 표현 만하면됩니다.

+0

내 프로젝트에서 'MyViewController * vc = [[MyViewController alloc] initWithNibName : @ "myNib"번들 : nil];' – MGames

+0

이 코드를 AppDelegate에 넣을 수 있습니까? 나는 정말로 혼란 스럽다. – MGames

+0

같은 장소, UIViewController 대신 * 컨트롤러 = (UIViewController *) NSClassFromString (savedClassName); – shim