*

ソースコードからStoryboardにアクセスする

公開日: : 最終更新日:2015/01/20 Tips , ,

複数の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を取得できる。

9264278117b2b7fec9f8beee985a713c

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

記事を読む

iOS7の青色

iOS7の標準UIで使われている、水色に近い青の色についての記事です。 あの色には特に名前を決まっ

記事を読む

iOSシミュレータの帯域制限をテストする

iOSシミュレータで通信帯域制限をテストしたいと思ったんですが、Xcode8からXcode7.xとは

記事を読む

AdMob組み込み覚書

書籍ではコレがかなり参考になるのでご紹介。 表題の通りで、組み込みで要注意っぽい部分だけを

記事を読む

アプリ内で自動スリープの設定を無効化する

「設定」アプリ内で設定したスリープ時間設定を無効にするためのコード。 アプリがバックグラウンドにな

記事を読む

バージョンアップ版があることを通知する

拍子抜けするほど簡単だったので、「アプリのバージョンアップの通知をどうするか」という話についてTip

記事を読む

Xcode10からのimage literal / color literalの指定方法

アセットにあるUIImageの直接指定が可能なImage litera

Xcode11でのバージョン番号の取得方法

Xcode11になってバージョン番号をスクリプトから得て自動で更新する

GoogleスプレッドシートからCSVにエクスポートしたデータを得る方法

情報がない中さんざ苦労しましたが、Googleスプレッドシート(の最初

画面回転をしたあとに、UITextViewの先頭を表示する

回転によりサイズが可変するUITextViewで、縦向き(ポートレイト

NXDrawKitを導入してみる

ACEDrawingViewがObj-Cで書かれていて、いまいちメンテ

→もっと見る

    PAGE TOP ↑