我明白了。谢谢垫片的信息!:
UIViewController* vc = (UIViewController*)[[UIStoryboard storyboardWithName:@"iPhone4" bundle:nil] instantiateViewControllerWithIdentifier:@"MyViewControllerIdentifier"];
if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"currentViewController"] isEqualToString:@"iPhone4Level1"])
{
[self.window setRootViewController: vc];
}
答案 0 :(得分:2)
您无法通过NSClassFromString
初始化课程。它不返回类的实例,它返回一个Class对象。这是一个有助于识别类的Objective C功能。这就是您收到此错误的原因,因为您尝试设置为根视图控制器的变量不是视图控制器,因此无法响应视图控制器方法。使用自己的初始值设定项初始化类
e.g。
MyViewController* vc = [[MyViewController alloc] init];
或者,如果您正在使用笔尖/故事板,请使用其他初始化程序:
MyViewController* vc = [[MyViewController alloc] initWithNibName: @"myNib" bundle: nil];
或
MyViewController* vc = (MyViewController*)[[UIStoryboard storyboardWithName:@"MyStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"MyViewControllerIdentifier"];
要做你想要完成的事情,你需要一些逻辑来根据保存的类来确定要加载的类。
e.g。
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语句或逻辑表达式。