Routable

作者: 考槃在涧 | 来源:发表于2018-08-07 10:08 被阅读99次

    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

          本文链接:https://www.haomeiwen.com/subject/atrovftx.html