我如何以编程的方式设置Storyboard中的InitialViewController
?我想根据某些条件,在每次启动时打开Storyboard的不同视图。
我如何以编程的方式设置Storyboard中的InitialViewController
?我想根据某些条件,在每次启动时打开Storyboard的不同视图。
如何在没有虚拟初始视图控制器的情况下进行设置
确保所有初始视图控制器都具有Storyboard ID。
在Storyboard中,取消第一个视图控制器的“Is initial View Controller”属性的选中状态。
如果你此时运行你的应用程序,你会读到:
Failed to instantiate the default view controller for UIMainStoryboardFile 'MainStoryboard' - perhaps the designated entry point is not set?
你会注意到在应用程序代理中,窗口属性现在为nil。
在应用程序的设置中,转到目标和Info
选项卡。清除Main storyboard file base name
的值。在General
选项卡中,清除Main Interface
的值。这将删除警告。
在应用程序代理的application:didFinishLaunchingWithOptions:
方法中创建窗口和所需的初始视图控制器:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *viewController = // determine the initial view controller here and instantiate it with [storyboard instantiateViewControllerWithIdentifier:<storyboard id>];
self.window.rootViewController = viewController;
[self.window makeKeyAndVisible];
return YES;
}
didFinishLaunchingWithOptions
在应用程序在新进程中启动时被调用。如果您转到主屏幕并返回应用程序,则不会再次调用此方法。(除非iOS由于内存限制而终止。)尝试停止应用程序,然后再从IDE中启动一次。如果问题仍然存在,请将问题发布到SO上,我很乐意帮助您,朋友。 - Travisself.window = UIWindow(frame: UIScreen.mainScreen().bounds)
var storyboard = UIStoryboard(name: "Main", bundle: nil)
var viewController: UIViewController = //
self.window!.rootViewController = viewController
self.window!.makeKeyAndVisible()
- mjmayank对于所有的Swift爱好者,这里是SWIFT翻译版由@Travis提供的答案:
在Objective C代码之前执行@Travis之前解释的步骤,然后:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var exampleViewController: ExampleViewController = mainStoryboard.instantiateViewControllerWithIdentifier("ExampleController") as! ExampleViewController
self.window?.rootViewController = exampleViewController
self.window?.makeKeyAndVisible()
return true
}
ExampleViewController
将成为您要显示的新的初始视图控制器。
操作步骤:
祝您编程愉快!
你可以在 (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中以编程方式设置关键窗口的根视图控制器。
例如:
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if (shouldShowAnotherViewControllerAsRoot) {
UIStoryboard *storyboard = self.window.rootViewController.storyboard;
UIViewController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"rootNavigationController"];
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];
}
return YES;
}
init()
/deinit()
周期,但不会执行viewDidLoad()
或正确初始化IBOutlet
。确保您的代码已准备好处理此情况。 - GaryUIDocumentBrowserViewController
添加支持。 - JKazSWIFT 5
如果您在Storyboard中没有设置ViewController作为初始ViewController,则需要执行以下两个操作:
最后,您现在可以在SceneDelegate中添加您的代码:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(windowScene: windowScene)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
// Make sure you set an Storyboard ID for the view controller you want to instantiate
window?.rootViewController = storyboard.instantiateViewController(withIdentifier: identifier)
window?.makeKeyAndVisible()
}
UIWindow(windowScene: windowScene)
是与旧的基于App Delegate的代码中使用的initWithFrame:
不同的UIWindow初始化程序。如果您正在移植到新的操作方式,请确保更新它。使用旧的窗口初始化程序会导致黑屏。 - pkambSwift 3:更新@victor-sigler的代码
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
self.window = UIWindow(frame: UIScreen.main.bounds)
// Assuming your storyboard is named "Main"
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
// Add code here (e.g. if/else) to determine which view controller class (chooseViewControllerA or chooseViewControllerB) and storyboard ID (chooseStoryboardA or chooseStoryboardB) to send the user to
if(condition){
let initialViewController: chooseViewControllerA = mainStoryboard.instantiateViewController(withIdentifier: "chooseStoryboardA") as! chooseViewControllerA
self.window?.rootViewController = initialViewController
)
}else{
let initialViewController: chooseViewControllerB = mainStoryboard.instantiateViewController(withIdentifier: "chooseStoryboardB") as! chooseViewControllerB
self.window?.rootViewController = initialViewController
)
self.window?.makeKeyAndVisible(
return true
}
您可以将导航根视图控制器设置为主视图控制器。这个想法可以用于根据应用程序要求进行自动登录。
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
UIViewController viewController = (HomeController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"HomeController"];
UINavigationController navController = [[UINavigationController alloc] initWithRootViewController:viewController];
self.window.rootViewController = navController;
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
// do stuff for iOS 7 and newer
navController.navigationBar.barTintColor = [UIColor colorWithRed:88/255.0 green:164/255.0 blue:73/255.0 alpha:1.0];
navController.navigationItem.leftBarButtonItem.tintColor = [UIColor colorWithRed:88/255.0 green:164/255.0 blue:73/255.0 alpha:1.0];
navController.navigationBar.tintColor = [UIColor whiteColor];
navController.navigationItem.titleView.tintColor = [UIColor whiteColor];
NSDictionary *titleAttributes =@{
NSFontAttributeName :[UIFont fontWithName:@"Helvetica-Bold" size:14.0],
NSForegroundColorAttributeName : [UIColor whiteColor]
};
navController.navigationBar.titleTextAttributes = titleAttributes;
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}
else {
// do stuff for older versions than iOS 7
navController.navigationBar.tintColor = [UIColor colorWithRed:88/255.0 green:164/255.0 blue:73/255.0 alpha:1.0];
navController.navigationItem.titleView.tintColor = [UIColor whiteColor];
}
[self.window makeKeyAndVisible];
对于StoryboardSegue用户
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
// Go to Login Screen of story board with Identifier name : LoginViewController_Identifier
LoginViewController *loginViewController = (LoginViewController*)[mainStoryboard instantiateViewControllerWithIdentifier:@“LoginViewController_Identifier”];
navigationController = [[UINavigationController alloc] initWithRootViewController:testViewController];
self.window.rootViewController = navigationController;
[self.window makeKeyAndVisible];
// Go To Main screen if you are already Logged In Just check your saving credential here
if([SavedpreferenceForLogin] > 0){
[loginViewController performSegueWithIdentifier:@"mainview_action" sender:nil];
}
谢谢
打开主storyboard,选择您想要首先启动的视图,然后打开"实用工具-->属性"。在"视图控制器"下面,您会看到"是初始视图控制器"单选按钮。只需选择它即可。
--- 对于修改后的问题:
也许您可以尝试这样做:在您的初始视图的ViewDidLoad部分编写一个方法,当应用程序启动时运行该方法,该方法将触发一个segue到另一个视图。
您可以通过Interface Builder以及编程的方式来设置初始视图控制器。
以下是编程方法:
Objective-C :
self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"]; // <storyboard id>
self.window.rootViewController = viewController;
[self.window makeKeyAndVisible];
return YES;
Swift :
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var objMainViewController: MainViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MainController") as! MainViewController
self.window?.rootViewController = objMainViewController
self.window?.makeKeyAndVisible()
return true
我认为这是不可能的。 相反,您可以有一个初始控制器,它将具有到不同视图控制器的转场。在启动时,您可以编程决定要执行哪个转场。
如果您在iOS 13+中使用场景代理(Scene Delegates):
请确保在您的Info.plist
文件中找到以下行:
Application Scene Manifest > Scene Configuration > Application Session Role > Item 0
并且也需要在那里删除对于 Main Storyboard 的引用。否则,您将会收到有关无法从 storyboard 实例化的相同警告。
此外,将代码从应用程序委托移到场景委托方法 scene(_:willConnectTo:options:)
中,因为现在是处理生命周期事件的地方。