*

ソースコードから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)

関連記事

iPad用storyboard⇔iPhone用Storyboardへの変換

iPad用アプリとしてiPad用前提のstoryboardから、iPhone対応にするにあたり、si

記事を読む

Realmで==ができなかった

最近Realm Swiftを使ってて、引っかかったところがあるのでメモ。 Realmのオブジェクト

記事を読む

plistファイルに色を入れる

plistファイル中にUIColorを入れたい!という場合。普通RGBAの値を数値で入れるとかするけ

記事を読む

コードでiPhone6 Plusを識別する簡単な方法

表題の通り、コードでiPhone6 Plusを識別する簡単な方法です。 iPhone6 Plu

記事を読む

HTMLParserを修正する

HTMLスクレイピングしてる時に役立つライブラリであるObjective-C-HMTL-Parser

記事を読む

AdMob組み込み覚書

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

記事を読む

Xcode8で余計なログを抑制する

Xcode8に更新してから、妙にログが増えたので、NSLogで明示したのと実行時エラー以外のログを吐

記事を読む

UITableViewのセルセパレータが画像の下部分だけ切れる場合の対応

iOS7のUItableViewCellだと、UITableView.imageViewに画

記事を読む

Xcode5.1のInterfaceBuilderにおける地味な変更点

iOS7.1に合わせてXcode5.1がリリースされました Xcode Release N

記事を読む

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

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

記事を読む

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

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

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

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

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

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

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

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

NXDrawKitを導入してみる

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

→もっと見る

    PAGE TOP ↑