私の問題は、ストーリーボードとxibの両方を使用する方法を探していたことです。しかし、ストーリーボードをプログラムでロードして表示する適切な方法を見つけることができません。プロジェクトはxibを使用して開発を開始しましたが、すべてのxibファイルをストーリーボードにネストすることは非常に困難です。そこで、viewControllersのalloc, init, Push
のように、コードでそれを行う方法を探していました。私の場合、ストーリーボードにあるコントローラはUITableViewController
だけです。これには、表示したいコンテンツのある静的セルがあります。大規模なリファクタリングなしでxibとストーリーボードの両方を使用する適切な方法を知っている人がいれば、どんな助けでも感謝します。
ストーリーボードで属性インスペクターに移動し、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];
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "viewController")
self.navigationController!.pushViewController(vc, animated: true)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("viewController")
self.navigationController!.pushViewController(vc, animated: true)
前提条件
View Controllerにストーリーボード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)
属性インスペクターでそのView Controllerの識別子を指定すると、以下のコードが機能します
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
DetailViewController *detailViewController = [storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];
[self.navigationController pushViewController:detailViewController animated:YES];
これを試して
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)
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"
いつでもルートコントローラーにジャンプできます。
UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [storyboard instantiateInitialViewController];
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:vc animated:YES completion:NULL];