web-dev-qa-db-ja.com

クラスからストーリーボードをプログラムで読み込むにはどうすればよいですか?

私の問題は、ストーリーボードxibの両方を使用する方法を探していたことです。しかし、ストーリーボードをプログラムでロードして表示する適切な方法を見つけることができません。プロジェクトはxibを使用して開発を開始しましたが、すべてのxibファイルをストーリーボードにネストすることは非常に困難です。そこで、viewControllersのalloc, init, Pushのように、コードでそれを行う方法を探していました。私の場合、ストーリーボードにあるコントローラはUITableViewControllerだけです。これには、表示したいコンテンツのある静的セルがあります。大規模なリファクタリングなしでxibとストーリーボードの両方を使用する適切な方法を知っている人がいれば、どんな助けでも感謝します。

168
kokoko

ストーリーボードで属性インスペクターに移動し、View Controllerの識別子を設定します。その後、次のコードを使用してそのView Controllerを表示できます。

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"myViewController"];
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:vc animated:YES completion:NULL];
350
James Beith

スイフト3

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "viewController")
self.navigationController!.pushViewController(vc, animated: true)

スイフト2

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("viewController")
self.navigationController!.pushViewController(vc, animated: true)

前提条件

View ControllerにストーリーボードIDを割り当てます。

Storyboard ID

IB> IDインスペクターを表示> ID>ストーリーボードID

Swift(レガシー)

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("viewController") as? UIViewController
self.navigationController!.pushViewController(vc!, animated: true)

編集:Swift 2 Fred A。によるコメントで提案

navigationControllerなしで使用する場合は、次のように使用する必要があります。

    let Storyboard  = UIStoryboard(name: "Main", bundle: nil)
    let vc = Storyboard.instantiateViewController(withIdentifier: "viewController")
    present(vc , animated: true , completion: nil)
60
SwiftArchitect

属性インスペクターでそのView Controllerの識別子を指定すると、以下のコードが機能します

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
DetailViewController *detailViewController = [storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];
[self.navigationController pushViewController:detailViewController animated:YES];
15
chaithraVeeresh

これを試して

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"Login"];

[[UIApplication sharedApplication].keyWindow setRootViewController:vc];

スイフトで
NavigationControllerおよびpushControllerの代わりに使用できます

present(vc, animated:true , completion: nil)
2
Tarik

Swift 3 and 4の場合、これを行うことができます。 StoryboardIDに等しいStoryboardの名前を設定することをお勧めします。

enum StoryBoardName{
   case second = "SecondViewController"
}
extension UIStoryBoard{
   class func load(_ storyboard: StoryBoardName) -> UIViewController{
      return UIStoryboard(name: storyboard.rawValue, bundle: nil).instantiateViewController(withIdentifier: storyboard.rawValue)
   }
}

そして、次のようにViewControllerにストーリーボードをロードできます:

class MyViewController: UIViewController{
     override func viewDidLoad() {
        super.viewDidLoad()
        guard let vc = UIStoryboard.load(.second) as? SecondViewController else {return}
        self.present(vc, animated: true, completion: nil)
     }

}

新しいStoryboardを作成するときは、StoryboardIDに同じ名前を設定し、enumにStoryboard名を追加するだけです "StoryBoardName"

1
gandhi Mena

いつでもルートコントローラーにジャンプできます。

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [storyboard instantiateInitialViewController];
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:vc animated:YES completion:NULL];
0
user938797