201
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

スパゲッティから脱出!iOS開発における遷移の問題をすっきり解決する便利ルーティングライブラリをご紹介

by @mixiappwchr

みなさん、最近はstoryboardを使ってバリバリ開発していることと思いますが、調子に乗っているとこのようになったりしませんでしょうか?

スクリーンショット 2014-03-17 10.08.33_120.png

複雑過ぎでどうなっているかわかりません。。。!

storyboardのsegueは直感的でわかりやすいのですが、そのままsegueでの遷移ばかり使っているすぐにスパゲッティなviewになります。
適切に複数のstoryboardに分けたり、xibとの使い分けを行えば良いのですが、めんどくさかったりします。

そもそもiOSの開発において画面を遷移するパターンは様々です。

  • navigationControlerへのpush
  • presentViewControllerでの表示
  • view単体でのaddSubview
  • 外部アプリからのscheme起動、またはその逆

これらの概念をもっとすっきりしたい、、そうだ!僕らにはあれがあるじゃないか!と思い立ち,ライブラリを作りました。

MYRoutes

このライブラリは,web service開発では当たり前で使っているroutingの概念をiOS開発にも持ち込んで、
遷移の問題を単純化しようというライブラリです。
それだけでなく、遷移に関するコードをシンプルにまとめあげています。

 [[MYRoutes shared] loadRouteConfig:@[
      @[@"/nib/:message" ,@{@"nib":@"XIBTestViewController",@"class":@"MYViewController"}],
      @[@"/storyboard/first/:message" , @{@"storyboard":@"Main",@"identifier":@"First"}],
 ]];

とルーティングの設定を行っておくと

 [[MYRoutes shared] dispatch:[NSURL URLWithString:@"/nib/hello?category_id=1"]]

とURLを渡してあげると,設定にそってViewを表示してくれます。

パラメーターも当然URLから引き渡すことができ,

 @[@"/nib/:message" ,@{@"nib":@"XIBTestViewController",@"class":@"MYViewController"}],

と設定されていると:messageといった記述をパラメーターをキャプチャする設定となり

[routes dispatch:[NSURL URLWithString:@"/nib/hello?category_id=1"]

といったURLは指定のViewControllerにmessageプロパティに@"hello"がセットされた状態で表示されます。
またquery からも設定することができ,この場合はcategoryIdに@"1"がセットされます。URLなのでスネークケースで書くことが多いと思いますが、自動でキャメルケースに変更してsetします。

当然URL schemeからの起動にそのまま対応することができ

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    // dispatch from url scheme. example xxxx://tweet/view/id
    return [[MYRoutes shared] dispatch:url ];
}

とAppDelegateよりURLを渡してあげれば、適切に処理することが可能です。なによりコードが煩雑にならずにRouting設定で管理することが可能です。

逆に外部のアプリケーションの起動も同じくURLを渡せばOKです。

[routes dispatch:[NSURL URLWithString:@"http://www.yahoo.co.jp"]]

その他にも、URLからのルーティングではない、呼び出し方を便利にするメソッドも用意しています。

例えば、pushしたい場合にパラメーターもつけたい場合

NSDictionary *params = @{@"message":self.messageTexfield.text};
[routes pushViewController:@"ViewControllerIdnetifier" withStoryboard:@"StoryboardName" withParameters:params animated:YES completion:nil];

と書くことでセットしたDictionaryのパラメータをもたせてpushすることが可能です。
またpush先のnavigationControllerは自動判別するため、現在のnavigationControllerが取得できない場所でも起動ができます。

まだ、カッとなって作ったばかりなので機能が貧弱でcocoapodsにも最新版がインデックスされてないのですが、よければ使ってみてください!

appwchr post

iOSの開発をする上で絶対に使うべき!外せない!webサービス、開発ツール集

iOSでこんなアプリ,こんな機能を作りたかったらこれを見ろ!作りたいアプリに対応するクラス、フレームワーク、ライブラリのまとめ!

注目のiBeacomなどの波に乗り遅れないために!iOSのBluetooth開発を容易にするライブラリを書きました。

まだまだあった!iOSの開発を劇的に改善する最新のwebサービス、開発ツール集1

さらに快適なアプリ開発を!iOSの開発をもっと劇的に改善する最新のwebサービス、開発ツール集2

スパゲッティから脱出!iOS開発における遷移の問題をすっきり解決する便利ルーティングライブラリをご紹介

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
201
Help us understand the problem. What are the problem?