使用 AppDelegate 中的 Storyboard 以编程方式实例化视图控制器
Posted
技术标签:
【中文标题】使用 AppDelegate 中的 Storyboard 以编程方式实例化视图控制器【英文标题】:Instantiating a View Controller programmatically with Storyboard from AppDelegate 【发布时间】:2013-12-12 09:53:25 【问题描述】:我正忙于构建一个应用程序 - 第一次启动时它要求用户做两件事:
-
选择一个国家
接受条款和条件
从那里转到主视图控制器。
我目前面临的问题是将第一个视图控制器从我的应用代理推送到屏幕上。我正在使用故事板/Xcode 5/ios7
这是我想出的代码:
UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle: nil];
BBCounterySettingsViewController *controller = (BBCounterySettingsViewController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"CountrySettings"];
[navigationController pushViewController:controller animated:NO];
问题是应用程序在到达最后一行代码时崩溃,并出现以下错误:
* 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'-[UIViewController pushViewController:animated:]: 无法识别的选择器发送到实例 0x8e9a400'
有人知道我做错了什么吗?
【问题讨论】:
【参考方案1】:您期望self.window.rootViewController
是UINavigationController
,但它是UIViewController
。这意味着情节提要中最外层的视图控制器类型错误。
获得UINavigationController
(在这种情况下应该有效)的更好方法是在任何UIViewController
上使用属性self.navigationController
。
据我了解,您希望在用户第一次运行以让用户选择一些东西时呈现一个视图。然后你应该做的是呈现一个模态视图控制器,如下所示:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
//isFirstRun is some boolean you use to determine if it's the first run
if(isFirstRun)
BBCounterySettingsViewController *controller = (BBCounterySettingsViewController *)[mainStoryboard instantiateViewControllerWithIdentifier: @"CountrySettings"];
[self.window.rootViewController presentViewController: controller animated:YES completion:nil];
【讨论】:
我认为我采用这种方法是错误的。这个视图控制器不需要在其他任何地方导航。只是需要被解雇。该应用程序的其余部分是基于标签栏的应用程序。在应用委托 self.navigationController 中不存在?【参考方案2】:你需要做两件事:
-
在 Storyboard 中,您提到了控制器名称(例如 LoginView)并启用使用 storyboard ID
然后你有用户下面的行
loginView = [storyboard instantiateViewControllerWithIdentifier:@"LoginView"];
[(UINavigationController*)self.window.rootViewController pushViewController:loginView animated:NO];
希望这会有所帮助。如果您仍有问题,请告诉我。
【讨论】:
感谢这也有帮助。 如果将您的 viewController 嵌入到一些 UINavigationController 中,您也可以使用instantiateInitialViewController()
方法 thom UIStoryBoard
。这会自动加载在情节提要上标有箭头的 viewController。如果这个 viewController 是一个容器,它的孩子也会被加载。【参考方案3】:
[self performSegueWithIdentifier:@"buyListSegue" sender:sender];
【讨论】:
没有帮助。 Segues 不能从 AppDelegate 或 viewControllers 发生,它不是 UINavigationController 的一部分【参考方案4】:我认为控制器标识符"CountrySettings"
设置为错误的控制器。你没有得到NavigationController
在那里你可以打电话给pushViewController
...
【讨论】:
已解决问题,谢谢。标记的答案就是问题所在。以上是关于使用 AppDelegate 中的 Storyboard 以编程方式实例化视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
UIApplication 中的窗口和 AppDelegate 中的窗口是啥关系?
使用 Storyboards 将数据模型分配给 appDelegate 中的视图控制器 - ios
如何将 CoreLocation 值从一个 VIewController 传递到 iOS 中的 AppDelegate?