web-dev-qa-db-ja.com

storyBoardのrootViewControllerをプログラムで変更する

Storyboardsを使用してプロジェクトを作成しました。ルートViewControllerStoryboard内にありますが、appDelegateには単一のコードを記述していません。

次に、アプリのツアーを表示したいので、ルートViewControllerTab BarからTourVCに変更し、アプリのツアーが終了したら、ルートViewControllerを再びTab Barに戻します。

だから私はオンラインで調べて、次の点に従いました

1)app.plistファイルからStoryboardsを削除します。2)ルートStoryboardsであるため、Tab Barコントローラーの場合にチェックされるViewControllerからオプション「isInitialViewController」をオフにします。3)このコードをappDelegate.mファイルに追加します。

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;

しかし、私のアプリはこのエラーログでクラッシュし、

[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:.
45
Ranjit

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
138
Sunny Shah

enter image description here メインストーリーボードでクラスのストーリーボードIDを設定します。

UIStoryboard *MainStoryboard = [UIStoryboard storyboardWithName:@"Main"
                                                                     bundle: nil];

UINavigationController *controller = (UINavigationController*)[MainStoryboard
                                                                           instantiateViewControllerWithIdentifier: @"RootNavigationController"];


LoginViewController *login=[MainStoryboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
            [controller setViewControllers:[NSArray arrayWithObject:login] animated:YES];
self.window.rootViewController=controller;
11
Mayank Jain

Swiftでは、次のように実装できます

let storyboard = UIStoryboard(name: "StartingPage", bundle: NSBundle.mainBundle())      
let loginView: SignInVC = storyboard.instantiateViewControllerWithIdentifier("SignInVC") as! SignInVC
UIApplication.sharedApplication().keyWindow?.rootViewController = loginView
7
Nischal Hada

私は簡単なこれを使用します:

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"NameOfStoryBoard" bundle:nil];
UITabBarController *rootViewController = [sb instantiateViewControllerWithIdentifier:@"NameOfTabBarController"];
[[UIApplication sharedApplication].keyWindow setRootViewController:rootViewController];
6
MUHAMMAD WASIM

Sunny Shahの答えに加えて、これはSwift 3バージョンです:

        let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let viewController: UIViewController = mainStoryBoard.instantiateViewController(withIdentifier: "MainTabBarController") as! UITabBarController
        UIApplication.shared.keyWindow?.rootViewController = viewController
3
Aldo Gomez

これは古い記事ですが、返信します。次のコードはお勧めしません。

let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = mainStoryboard.instantiateViewController(withIdentifier: "tabBarcontroller") as! UITabBarController
UIApplication.shared.keyWindow?.rootViewController = viewController

2つのインスタンスを作成しているためです。適切なViewControllerで次のコードを記述することをお勧めします。

let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = self
2
WaFuNuke

Swift 3コード:

DidFinishLaunchingWithOptions Appdelegate関数で以下を使用します。 「HomeViewController」を、アプリの起動時にルートViewControllerとして設定するViewControllerに置き換えます。

self.window = UIWindow(frame: UIScreen.main.bounds)

let storyboard = UIStoryboard(name: "Main", bundle: nil)

let initialViewController = storyboard.instantiateViewController(withIdentifier: "HomeViewController")

self.window?.rootViewController = initialViewController
self.window?.makeKeyAndVisible()

return true
1
Karan Dua

客観的C

ステップ1:info.plistからメインストーリーボードを削除する

手順2:ストーリービルダーIDをインターフェイスビルダーのView Controllerに追加します

ステップ3:アプリケーションに以下のコードを追加しましたapp delegateのfinishメソッド

self.window = [[UIWindow alloc] initWithFrame: [UIScreen mainScreen].bounds];


//set main story board
if( condition){
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"StoryboardName1" bundle:nil];
    UIViewController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"ViewController1"];
    [[UIApplication sharedApplication].keyWindow setRootViewController:rootViewController];
    [self window].rootViewController = rootViewController;
    [self.window makeKeyAndVisible];
}else{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"StoryboardName2" bundle:nil];
    UIViewController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"ViewController2"];
    [[UIApplication sharedApplication].keyWindow setRootViewController:rootViewController];
    [self window].rootViewController = rootViewController;
    [self.window makeKeyAndVisible];
}
1
Daniel Raouf