使用Storyboard以编程方式设置初始视图控制器

Use*_*Dev 247 objective-c uiviewcontroller ios uistoryboard swift

如何以编程方式设置InitialViewController故事板?我想根据某些条件打开我的故事板到不同的视图,这些条件可能因发布而异.

Tra*_*vis 459

如何没有虚拟初始视图控制器

确保所有初始视图控制器都具有Storyboard ID.

在故事板中,取消选中第一个视图控制器中的"是初始视图控制器"属性.

如果您此时运行您的应用程序,您会看到:

Failed to instantiate the default view controller for UIMainStoryboardFile 'MainStoryboard' - perhaps the designated entry point is not set?
Run Code Online (Sandbox Code Playgroud)

你会注意到app delegate中的window属性现在为零.

在应用程序的设置中,转到目标和Info选项卡.有明确的价值Main storyboard file base name.在General选项卡上,清除值Main Interface.这将删除警告.

在app delegate的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;
}
Run Code Online (Sandbox Code Playgroud)

  • 爱!爱!爱!我将使用它在IOS6和IOS7的两个完全不同的视图控制器树之间切换.似乎是处理向后兼容性的最佳方式,同时仍然使用IOS7中的所有铃声和口哨声. (7认同)
  • 我正在学习Swift中的iOS编程.谁能帮助我如何在swift中编写上面的代码.请帮忙.谢谢. (6认同)
  • @peyman根据我的调查,一旦删除了对主要故事板的引用,窗口就不存在了.我在当前项目中注释掉了窗口实例化,发现仍然如此. (2认同)
  • @Raghav,这是swift代码:`self.window = UIWindow(frame:UIScreen.mainScreen().bounds)var storyboard = UIStoryboard(name:"Main",bundle:nil)var viewController:UIViewController = // self.window !.rootViewController = viewController self.window!.makeKeyAndVisible()` (2认同)

小智 118

对于所有Swift爱好者来说,这里是@Travis翻译成SWIFT的答案:

执行@Travis在Objective C代码之前解释的内容.然后,

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
}
Run Code Online (Sandbox Code Playgroud)

ExampleViewController将是您想要显示的新的初始视图控制器.

步骤说明:

  1. 使用当前窗口的大小创建一个新窗口,并将其设置为主窗口
  2. 实例化我们可用于创建新的初始视图控制器的故事板
  3. 根据它的Storyboard ID实例化我们的新初始视图控制器
  4. 将我们新窗口的根视图控制器设置为我们刚刚启动的新控制器
  5. 让我们的新窗口可见

享受和愉快的编程!

  • 不需要故事板ID的提示是在故事板中明确设置初始视图控制器(rootViewController),并使用实例方法UIStoryboard.instantiateInitialViewController()来获取控制器而不是上面提出的UIStoryboard.instantiateViewControllerWithIdentifier().其余的都是一样的. (2认同)

Che*_*ong 45

您可以以编程方式设置密钥窗口的rootViewController (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;
}
Run Code Online (Sandbox Code Playgroud)


rs7*_*rs7 21

快速 5

如果您没有将 ViewController 设置为故事板中的初始 ViewController,您需要做两件事:

  1. 转到您的项目 TARGETS,选择您的项目 -> General -> 清除 Main Interface 字段。
  2. 始终在项目 TARGETS 中,现在转到 Info -> Application Scene Manifest -> Scene Configuration -> Application Session Role -> Item0(默认配置)-> 删除故事板名称字段。

最后,您现在可以在 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()

}
Run Code Online (Sandbox Code Playgroud)

  • 这当然是 Xcode 11.5 的最新答案,并且确实修复了“无法实例化 UIMainStoryboardFile 'Main' 的默认视图控制器 - 也许未设置指定的入口点”警告。 VC中的代码。重要的一点是,当 @rs7 说“删除情节提要名称字段”时,他们指的是 plist 的整行,而不仅仅是字段本身的内容。 (4认同)

小智 13

Swift 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
}
Run Code Online (Sandbox Code Playgroud)


Bha*_*311 9

您可以将Navigation rootviewcontroller设置为主视图控制器.这个想法可以根据应用要求用于自动登录.

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];
Run Code Online (Sandbox Code Playgroud)

对于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];
}
Run Code Online (Sandbox Code Playgroud)

谢谢


m.e*_*tka 6

打开mainstoryboard,选择首先要启动的视图,然后打开Utilities - > Attributes.在"View Controller"下方,您会看到"Is Initial View Controller"单选按钮.只需选择它.

---修改后的问题:

也许你可以试试这个:在你的初始视图的ViewDidLoad部分写一个方法,当方法在应用程序启动时运行时,方法触发一个segue到另一个视图.