ソースコードから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)
関連記事
-
User Defined Runtime Attributeについての覚書
UILabelに上下左右のパディングをつける方法を探して、結局「自分で以下のようなメソッドを持った拡
-
iOS9でのNSFetchedResultsContollerDelegateの挙動
ハマったので短いながらメモしたいと思います。 NSFetchedResultsContollerD
-
iOS8のシミュレーターでLocalizationのテストをする
iOS8.1のシミュレーターでは、従前できていたシミュレーター内での「設定」(Setting)からの
-
ENMLからHTMLへの変換
最近EvernoteAPIをいじっているので、コレに関するノウハウをとりあえず断片的に引っかかったと
-
画面回転をしたあとに、UITextViewの先頭を表示する
回転によりサイズが可変するUITextViewで、縦向き(ポートレイト)から横向き(ランドスケープ)
-
CALayerの管理
CALayerはNSKeyValueCodingを実装している(Core Animation Ext
-
コードでiPhone6 Plusを識別する簡単な方法
表題の通り、コードでiPhone6 Plusを識別する簡単な方法です。 iPhone6 Plu
-
iOS6時代のアプリのiOS7への対応
やや古い情報になるが、iOS7対応に関して自分がやったことの覚え書き。いろんな所から拾って来た情
-
iOS7でのPopover内サイズの指定
UIPopover内で表示する場合のViewControllerのコンテンツサイズ設定に関してのメモ