Routable

Routable中的类

UPRouterOptions
UPRouter
Routable : UPRouter
RouterParams

Routable继承自UPRouter,提供了一个单例方法:+ (instancetype)sharedRouter;保证一个生命周期中只使用同一个Routable对象。

Routable是核心类,实现了注册、调用Open跳转页面等基本功能。

注册

[[Routable sharedRouter] map:@"user/:id" toController:[ViewController class]];这里的map是和后台约定好的规则,user是host,后面接着你需要的参数,后台返回给你字符串,就可以自己去跳转和处理需要的参数了。注册的格式为host/:param1/:param2

查看源代码,他其实通过map值经过UPRouterOptions类的转换,把map的值当做key映射到字典self.routes里,value值是对应的viewcontroller

- (void)map:(NSString *)format toController:(Class)controllerClass withOptions:(UPRouterOptions *)options {
  if (!format) {
    @throw [NSException exceptionWithName:@"RouteNotProvided"
                                   reason:@"Route #format is not initialized"
                                 userInfo:nil];
    return;
  }
  if (!options) {
      // like [NSArray array]
    options = [UPRouterOptions routerOptions];
  }
  options.openClass = controllerClass;
  [self.routes setObject:options forKey:format];
}

页面跳转

注册成功后就可以调用open方法进行页面跳转。

- (void)open:(NSString *)url animated:(BOOL)animated {
    
    // routerParams 包含ViewController 打开的方式  参数(openParams)
  RouterParams *params = [self routerParamsForUrl:url];
  UPRouterOptions *options = params.routerOptions;
  
    // callBack
  if (options.callback) {
    RouterOpenCallback callback = options.callback;
    callback([params controllerParams]);
    return;
  }
  
    
  if (!self.navigationController) {
    if (_ignoresExceptions) {
      return;
    }
    
    @throw [NSException exceptionWithName:@"NavigationControllerNotProvided"
                                   reason:@"Router#navigationController has not been set to a UINavigationController instance"
                                 userInfo:nil];
  }
  
  UIViewController *controller = [self controllerForRouterParams:params];
  
  if (self.navigationController.presentedViewController) {
    [self.navigationController dismissViewControllerAnimated:animated completion:nil];
  }
  
  if ([options isModal]) {
    if ([controller.class isSubclassOfClass:UINavigationController.class]) {
      [self.navigationController presentViewController:controller
                                              animated:animated
                                            completion:nil];
    }
    else {
      UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:controller];
      navigationController.modalPresentationStyle = controller.modalPresentationStyle;
      navigationController.modalTransitionStyle = controller.modalTransitionStyle;
      [self.navigationController presentViewController:navigationController
                                              animated:animated
                                            completion:nil];
    }
  }
  else if (options.shouldOpenAsRootViewController) {
    [self.navigationController setViewControllers:@[controller] animated:animated];
  }
  else {
    [self.navigationController pushViewController:controller animated:animated];
  }
}

首先根据url获取对应的RouterParams对象,RouterParams包含RouterOptions包含openClass和跳转方式等,openParams是需要传递的参数。

然后取到需要跳转的ViewController,并且为参数赋值,设置跳转形式动画等。ViewController需要实现initWithRouterParams:方法或者allocWithRouterParams方法,完成参数的传递。然后通过UPRouterOptions中的参数判断跳转方式完成页面跳转。

如果是callBack

typedef void (^RouterOpenCallBack)(NSDictionary *params)

你可能感兴趣的:(Routable)