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

by @mixiappwchr

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

![スクリーンショット 2014-03-17 10.08.33_120.png](https://qiita-image-store.s3.amazonaws.com/0/37731/68bb06d9-a1f4-58f6-2348-02eef0250690.png)

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

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

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

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

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

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

https://github.com/nyankichi820/MYRoutes

```objcobjc
 [[MYRoutes shared] loadRouteConfig:@[
      @[@"/nib/:message" ,@{@"nib":@"XIBTestViewController",@"class":@"MYViewController"}],
      @[@"/storyboard/first/:message" , @{@"storyboard":@"Main",@"identifier":@"First"}],
 ]];
```
とルーティングの設定を行っておくと

```objc
 [[MYRoutes shared] dispatch:[NSURL URLWithString:@"/nib/hello?category_id=1"]]
```
とURLを渡してあげると,設定にそってViewを表示してくれます。

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

```objc
 @[@"/nib/:message" ,@{@"nib":@"XIBTestViewController",@"class":@"MYViewController"}],
```
と設定されていると:messageといった記述をパラメーターをキャプチャする設定となり

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


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

```objc
- (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です。

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

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

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

```objc
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サービス、開発ツール集](http://qiita.com/appwatcher/items/07a3babcb9b6cefb307e)

[iOSでこんなアプリ,こんな機能を作りたかったらこれを見ろ！作りたいアプリに対応するクラス、フレームワーク、ライブラリのまとめ！]
(http://qiita.com/appwatcher/items/b02255026a3ee6d95142)

[注目のiBeacomなどの波に乗り遅れないために！iOSのBluetooth開発を容易にするライブラリを書きました。]
(http://qiita.com/appwatcher/items/7491beffd7260b713542)

[まだまだあった！iOSの開発を劇的に改善する最新のwebサービス、開発ツール集１]
(http://qiita.com/appwatcher/items/f0024fe2ac34da345f04)

[さらに快適なアプリ開発を！iOSの開発をもっと劇的に改善する最新のwebサービス、開発ツール集2]
(http://qiita.com/appwatcher/items/c15d7311e71b4c2b77f1)

[スパゲッティから脱出！iOS開発における遷移の問題をすっきり解決する便利ルーティングライブラリをご紹介]
(http://qiita.com/appwatcher/items/259e8d13fff0547e90af)