问题描述
我使用 Storyboards
创建了我的项目.根 ViewController
位于 Storyboard
内,我没有在 appDelegate
中编写任何代码.
I have created my project using Storyboards
. The root ViewController
lies inside a Storyboard
, I have not written a single code in the appDelegate
.
现在我想展示我的应用程序的导览,所以我想将根 ViewController
从 Tab Bar
更改为我的 TourVC,并且当应用程序导览是完成,我想再次将我的根 ViewController
切换回 Tab Bar
.
Now I want to show a tour of my app, so I want to change the root ViewController
from Tab Bar
to my TourVC and when the tour of the app is finished , I want to again switch back my root ViewController
to Tab Bar
.
于是上网查了一下,按照以下几点
So I looked up online and followed the following points
1) 从 app.plist 文件中删除 Storyboards
,2) 取消选中 Storyboards
中的选项isInitialViewController",在 Tab Bar
控制器的情况下选中该选项,因为它是根 ViewController
,3) 将此代码添加到 appDelegate.m 文件中.
1) Remove Storyboards
from app.plist file,2) Uncheck option "isInitialViewController" from Storyboards
which is checked in case of Tab Bar
controller because its a root ViewController
,3) Add this code in appDelegate.m file.
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
ProductTourViewController *PT = [[ProductTourViewController alloc] initWithNibName:@"ProductTourViewController" bundle:nil];
self.window.rootViewController = PT;
[self.window makeKeyAndVisible];
return YES;
但我的应用程序崩溃并显示此错误日志,
But my app crashes with this error log,
[ProductTourViewController selectedViewController]: unrecognized selector sent to instance 0x1766a9e0
我也收到了警告,
Unsupported Configuration: Scene is unreachable due to lack of entry points and does not have an identifier for runtime access via -instantiateViewControllerWithIdentifier:.
推荐答案
Objective-C:
Objective-C:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UITabBarController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"tabBarcontroller"];
[[UIApplication sharedApplication].keyWindow setRootViewController:rootViewController];
斯威夫特:
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = mainStoryboard.instantiateViewControllerWithIdentifier("tabBarcontroller") as UITabBarController
UIApplication.sharedApplication().keyWindow?.rootViewController = viewController;
斯威夫特 3:
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = mainStoryboard.instantiateViewController(withIdentifier: "tabBarcontroller") as! UITabBarController
UIApplication.shared.keyWindow?.rootViewController = viewController
Swift 5:
let viewController = mainStoryboard.instantiateViewController(withIdentifier: "tabBarcontroller") as! UITabBarController
UIApplication.shared.windows.first?.rootViewController = viewController
UIApplication.shared.windows.first?.makeKeyAndVisible()
或者简单地像这样:
let viewController = mainStoryboard.instantiateViewController(withIdentifier: "tabBarcontroller") as! UITabBarController
self.view.window?.rootViewController = viewController
self.view.window?.makeKeyAndVisible()
两者都很好!
这篇关于以编程方式更改 storyBoard 的 rootViewController的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!