ソースコードからStoryboardにアクセスする
公開日:
:
最終更新日:2015/01/20
Tips Storyboard, UIPopoverController, UIViewController
複数のStoryboardを利用して、自分以外のStoryboardに遷移させるような展開をしたい場合や、従来型のxibやらソースコードベースのViewControllerからStoryboardにアクセスしたい場合の対応方法。
UIStoryBoard* storyBoard = [UIStoryboard storyboardWithName:@"hogehogeStoryBoard" bundle:nil]; UIViewController* rootViewController = [storyboard instantiateInitialViewController];
instantiateInitialViewControllerではStoryboardでInitialに指定したViewControllerを取ってくるので、UINavigationControllerをInitialにした場合、目的のViewControllerはこうやって得たViewController(=UINavigationController)にアクセスする必要がある。
UINavigationController* rootNavigationController = [storyboard instantiateInitialViewController]; UIViewController* rootViewController = [[rootNavigationController viewControllers] lastObject];
複数のStoryboardを使うのは大量の画面を遷移するアプリで、適当な単位で分割できる場合(例えばメインの機能とは別に、複雑な選択/入力を必要とする設定画面のフローがある場合)などが考えられる。
そうすると機能単位ごとではゴチャつかずに画面遷移フローが見えるし、探す手間も減る。ただし(勿論別ファイルなので)俯瞰するのはやや分が悪いだろうか。
storyboardファイルをダブルクリックすると、別ウィンドウで開いてくれるので、大画面高解像度で利用する場合は特にメリットを享受できるかもしれない。
旧来のアプリを部分的にStoryboard化していく場合にも有効。つぎはぎするのが美しいかどうかは個人(組織)のポリシー次第。
次にStoryboardの特定のViewControllerを直接取得する方法。
こちらはAppleのサンプル「MyImagePicker」:https://developer.apple.com/library/ios/samplecode/MyImagePicker/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010135
を見てて知った手法。
どこにも接続されてないぼっちViewContorllerでも、Storyboard ID(IBで設定可能)を設定してやると
[storyBoard instantiateViewControllerWithIdentifier:@"[ViewControllerにつけたStoryboard ID]"]
で直接ViewControllerを取得できる。
Segueを使って接続してやれば通常の画面遷移はできるので使い道があまり思い浮かばないが、上記サンプルではエラーメッセージの表示(ライブラリへのアクセスが拒否された場合など)ViewControllerをこの手法で呼び出している。
おそらく「通常時とは異なる異常時フローなので、Segueを使って接続しない」というイメージでいるのではないかと想像。
なお、自分が現在使っているStoryboardが欲しい場合は、[UIStoryboard storyboardWithName: bundle]などと回りくどいことしなくても、self.storyboardで取得可能。
[2015/01/20追記]
「Popoverで表示したい場合」で検索が来たようなので追記。
こちらの記事でも軽く触れている通り、ViewControllerクラス内でpreferredContentSizeを指定したUIViewControllerクラスをStoryboardに配置して、上記の方法で得たViewControllerをUIPopoverControllerの初期化時に指定してやればOK。
複数のViewControllerから呼ばれる可能性もあるため、Storyboardに孤立したSegueを置くケースの1つになる。
参照サイト:
Qiita(http://qiita.com/tovi_01/items/33f4d0e9d5d1d9c99263)
関連記事
-
-
Realmで==ができなかった
最近Realm Swiftを使ってて、引っかかったところがあるのでメモ。 Realmのオブジェクト
-
-
UIButtonのLocalizeに関するTips
Storyboardに設置したUIButtonのタイトルのLocalizeをしてたのですが、英語では
-
-
Bitbucket課題の記法サンプル
Bitbucketの課題、およびwikiで利用できる記法についての記事です。 利用できる記法に
-
-
iOS6時代のアプリのiOS7への対応
やや古い情報になるが、iOS7対応に関して自分がやったことの覚え書き。いろんな所から拾って来た情
-
-
UILabelの改行をInterfaceBuilderから入力する
UILabelの行数は任意に設定できて、「0」を指定すると行数を限定しないで(UILabelのbou
-
-
iOSシミュレータの帯域制限をテストする
iOSシミュレータで通信帯域制限をテストしたいと思ったんですが、Xcode8からXcode7.xとは
-
-
AdMob組み込み覚書
書籍ではコレがかなり参考になるのでご紹介。 表題の通りで、組み込みで要注意っぽい部分だけを
-
-
アプリ内で自動スリープの設定を無効化する
「設定」アプリ内で設定したスリープ時間設定を無効にするためのコード。 アプリがバックグラウンドにな
-
-
バージョンアップ版があることを通知する
拍子抜けするほど簡単だったので、「アプリのバージョンアップの通知をどうするか」という話についてTip