Routable is an in-app native URL router, for iOS. Also available for Android.
Set up your app's router and URLs (usually done in application:didFinishLaunchingWithOptions:
):
[[Routable sharedRouter] map:@"users/:id" toController:[UserController class]];
// Requires an instance of UINavigationController to open UIViewControllers
[[Routable sharedRouter] setNavigationController:aNavigationController];
Implement initWithRouterParams:
in your UIViewController
subclass:
@implementation UserController
// params will be non-nil
- (id)initWithRouterParams:(NSDictionary *)params {
if ((self = [self initWithNibName:nil bundle:nil])) {
self.userId = [params objectForKey:@"id"];
}
return self;
}
Then, anywhere else in your app, open a URL:
NSString *aUrl = @"users/4";
[[Routable sharedRouter] open:aUrl];
If you wish to do custom allocation of a controller, you can use +allocWithRouterParams:
[[Routable sharedRouter] map:@"users/:id" toController:[StoryboardController class]];
@implementation StoryboardController
+ (id)allocWithRouterParams:(NSDictionary *)params {
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];
StoryboardController *instance = [storyboard instantiateViewControllerWithIdentifier:@"sbController"];
instance.userId = [params objectForKey:@"id"];
return instance;
}
pod 'Routable', '0.0.2'
#import <Routable/Routable.h>
If you're not able to use CocoaPods, please install Routable as a git submodule and add the files to your Xcode project.
You can invoke anonymous callbacks with Routable:
[[Routable sharedRouter] map:@"invalidate/:id" toCallback:^(NSDictionary *params) {
[Cache invalidate: [params objectForKey:@"id"]]];
}];
[[Routable sharedRouter] open:@"invalidate/5h1b2bs"];
You can configure if and how a UIViewController
is presented modally with UPRouterOptions
:
UPRouterOptions *options = [[UPRouterOptions modal] withPresentationStyle: UIModalPresentationFormSheet];
[self.router map:@"info" toController:[InfoController class]
withOptions:options];
UPRouterOptions
has the following DSL setters:
modal
withPresentationStyle:
withTransitionStyle:
forDefaultParams:
Sometimes you want to open a URL outside of your app, like a YouTube URL or open a web URL in the browser. You can use Routable to do that:
[[Routable sharedRouter] openExternal:@"http://www.youtube.com/watch?v=oHg5SJYRHA0"];
If you need to use multiple routers, simply create new instances of Router
:
UPRouter *adminRouter = [Routable newRouter];
[adminRouter map:@"profile" toController: [AdminProfile class]];
UPRouter *userRouter = [Routable newRouter];
[userRouter map:@"profile" toController: [UserProfile class]];
Clay Allsopp (http://clayallsopp.com)
Routable for iOS is available under the MIT license. See the LICENSE file for more info.