Objective-C
iPhone
Xcode
iOS
Storyboard

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

More than 3 years have passed since last update.

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開発にも持ち込んで、

遷移の問題を単純化しようというライブラリです。

それだけでなく、遷移に関するコードをシンプルにまとめあげています。

https://github.com/nyankichi820/MYRoutes

 [[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開発における遷移の問題をすっきり解決する便利ルーティングライブラリをご紹介