如何使上次访问 Viewcontroller 成为 RootViewController?

How To Make Last Visited Viewcontroller The RootViewController?

我明白了。感谢 shim 的信息!:

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

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

您无法通过 NSClassFromString 初始化 class。它不是 return class 的一个实例,它 return 是一个 Class 对象。这是一项 Objective C 功能,可帮助识别 classes。这就是您收到此错误的原因,因为您尝试设置为根视图控制器的变量不是视图控制器,因此无法响应视图控制器方法。 Classes 使用它们自己的初始化器进行初始化

例如

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

或者,如果您正在使用 nibs/storyboards,则使用其他初始化程序:

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

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

要完成您想要完成的任务,您需要一些逻辑来根据已保存的 class 确定要加载的内容 class。

例如

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 

但是,您最好将一些值定义为标识符(整数、字符串,任何您想要的)并保存这些值而不是 class 名称,因为 classes 可以是子class 编辑、重用等。您可能也不希望应用程序中的每个视图控制器 class 都是允许的起点。那么你就可以避免这个 NSClassFromString 业务而只做一个简单的 switch 语句或逻辑表达式。