by @mixiappwchr
みなさん、最近はstoryboardを使ってバリバリ開発していることと思いますが、調子に乗っているとこのようになったりしませんでしょうか?
複雑過ぎでどうなっているかわかりません。。。!
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でこんなアプリ,こんな機能を作りたかったらこれを見ろ!作りたいアプリに対応するクラス、フレームワーク、ライブラリのまとめ!]
(http://qiita.com/appwatcher/items/b02255026a3ee6d95142)
[注目のiBeacomなどの波に乗り遅れないために!iOSのBluetooth開発を容易にするライブラリを書きました。]
(http://qiita.com/appwatcher/items/7491beffd7260b713542)
[まだまだあった!iOSの開発を劇的に改善する最新のwebサービス、開発ツール集1]
(http://qiita.com/appwatcher/items/f0024fe2ac34da345f04)
[さらに快適なアプリ開発を!iOSの開発をもっと劇的に改善する最新のwebサービス、開発ツール集2]
(http://qiita.com/appwatcher/items/c15d7311e71b4c2b77f1)
[スパゲッティから脱出!iOS開発における遷移の問題をすっきり解決する便利ルーティングライブラリをご紹介]
(http://qiita.com/appwatcher/items/259e8d13fff0547e90af)