【问题标题】:How To Make Last Visited Viewcontroller The RootViewController?如何使上次访问的 Viewcontroller 成为 RootViewController?
【发布时间】:2015-03-24 10:55:19
【问题描述】:

我想通了。感谢 shim 提供的信息!:

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

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

【问题讨论】:

  • 提供有关崩溃的更多详细信息。它发生在哪里,它说什么,等等。
  • 但是我的代码正确吗? @shim
  • @shim 查看我对 NSLog 的编辑
  • 很高兴您更新了您的问题,但您真的不应该删除您的问题,以防将来的访问者想弄清楚您在问什么以及您尝试了什么不起作用。跨度>

标签: objective-c uiviewcontroller nsuserdefaults uistoryboard appdelegate


【解决方案1】:

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

例如

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 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语句或逻辑表达式。

【讨论】:

  • 在我的项目中我应该把 'MyViewController* vc = [[MyViewController alloc] initWithNibName: @"myNib" bundle: nil];'
  • 我可以把这段代码放在 AppDelegate 中吗?我真的很困惑。
  • 同一个地方,只是代替了 UIViewController *controller = (UIViewController *)NSClassFromString(savedClassName);
  • 请看我的编辑。我在应用程序委托中尝试了您的代码,但它仍然打开第一个视图。我做错了什么?
  • 您是否真的在视图控制器上设置了带有该标识符的情节提要?
猜你喜欢
  • 1970-01-01
  • 2019-08-27
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
相关资源
最近更新 更多