ソースコードから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)
関連記事
-
UIButtonのLocalizeに関するTips
Storyboardに設置したUIButtonのタイトルのLocalizeをしてたのですが、英語では
-
コードでiPhone6 Plusを識別する簡単な方法
表題の通り、コードでiPhone6 Plusを識別する簡単な方法です。 iPhone6 Plu
-
NSStringのフォーマット書式
Appleのページになく、IEEEのprintfフォーマットのページにあるので、C言語と親しくしてな
-
UIActionSheetの文字がブレて多重表示される
UIActionsheetを使っていて、iOS7/iPadの組み合わせで起こる不具合らしき挙動が起こ
-
bitbucketをXcode5で使用する
bitbucketは無償で5人までの少人数チーム用のクローズド(非公開)リポジトリを作成できるため、
-
UITableViewのセクションヘッダをStoryboardで作る時の参考
UITableViewのセクションヘッダをカスタムして作る際に、セルと同様にプロトタイピングするため
-
UITableViewのヘッダに小文字を入れる
UITableViewのセクションヘッダをStoryboardでカスタマイズするという話題を以前掲載
-
画面回転をしたあとに、UITextViewの先頭を表示する
回転によりサイズが可変するUITextViewで、縦向き(ポートレイト)から横向き(ランドスケープ)
-
AdMob組み込み覚書
書籍ではコレがかなり参考になるのでご紹介。 表題の通りで、組み込みで要注意っぽい部分だけを