在你的开发过程中,是否遇到过如下的需求:

  1. 在tableView类型的展示列表中,点击每个cell中人物头像都可以跳转到人物详情,可参见微博中的头像,同理包括转发、评论按钮、各种链接及linkcard。
  2. 跳转到任意页面
    • 产品要求,某个页面的不同banner图,点击可以跳转到任何一个页面,可能是原生的页面A、页面B,或者是web页C。
    • 在web页面,可以跳转到任何一个原生页面。
    • 在远程推送中跳转到任意指定的页面。

以上2种需求,我想大多数开发者都遇到过,并且可以实现这种功能。毕竟,这是比较基础的功能。但是代码未必那么优雅。

一般处理办法

针对  1. ,一般初学者会用target或者block等方法在tableView的代理方法拿到事件,并把要执行的跳转写到controller里。功能是可以实现的,但问题是这种cell及相似的cell(布局有些变化,或者多几个少几个控件)一般出现在多个页面。这样的话相同的代码就会出现在多个地方。就算把跳转方法抽取出来写成category,但是target或者block总是每个地方都要写的。

针对  2. ,初级的方法是每个地方写一坨判断及跳转,高级一些是抽取出来写在基类或者category。

优雅的解决办法

纵观上面各种情况,总结起来就是一句话, 在任意的地方触发事件(可以是推送,拦截的js跳转,各种控件的点击事件)可以跳转到任意界面。 所以我们可以统一用一个控制跳转的manager来完成跳转。

  1. 与后端约定好数据结构,例如:

    NSDictionary *target = @{@"action" : @"user",@"data"   : @{@"user_id" : @(123456)}};

    就是跳转到id为123456的用户页面,如果跳转需要更多的数据,可以在data的value里面继续添加。

  2. 创建一个用来跳转的类,可以起的牛x的名字,XXCoreActionManager。创建一个类方法:

    + (BOOL)doActionForTarget:(NSDictionary *)target{//根据你的app结构,来取得你当前的controller,由它来进行跳转UIApplication *application = [UIApplication sharedApplication];AppDelegate *myAppDelegate = (AppDelegate *)[application delegate];UIViewController *viewController;if ([myAppDelegate getTabbarSelectedView]) {viewController = [myAppDelegate getTabbarSelectedView].visibleViewController;}else {return NO;}if([json[@"action"] isEqualToString:@"film_view"]){MFMaterialListViewController *materialListVC = [[MFMaterialListViewController alloc] initWithNibName:@"MFMaterialListViewController" bundle:nil];materialListVC.hidesBottomBarWhenPushed = YES;materialListVC.filmId = json[@"data"][@"film_id"];[viewController.navigationController pushViewController:materialListVC animated:YES];return YES;}else if([json[@"action"] isEqualToString:@"home"]){[myAppDelegate getTabbar].selectedIndex = 0;[viewController.navigationController popToRootViewControllerAnimated:YES];return YES;}return NO;
    }

    在刚才定义的数据结构中,  action 的值为需要跳转的页面,  data 的值跳转所需要要的参数,比如  id 、  type等。服务器只需要传入相应的数据就可以用

    [XXCoreActionManager doActionForTarget:target];

    来进行跳转。真正的  write once,use anywhere

  3. 针对头像、评论、转发等多处使用的子控件,可以把事件由自己接收,通过XXCoreActionManager来进行跳转。即做到了代码分离,使之成为真正独立的控件,便于复用。下面是一个简单例子:

    @implementation MFUserHeadButton
    -(void)awakeFromNib{[self addTarget:self action:@selector(toUserDetail) forControlEvents:UIControlEventTouchUpInside];}- (void)toUserDetail{NSDictionary *target = @{@"action":@"user",@"data":@{@"user_id":@(self.tag)}};[XXCoreActionManager doActionForTarget:target];}

    这就是一个简单的实现跳转到个人页功能的头像控件实现。

    如果你问  user_id 的值怎么来的?

    当然是configCell的时候传给view的  tag 的。

    你可能会说,我的跳转需要多个参数啊,你一个tag不够用啊亲。

    可以定义一个NSDictionary属性接收啊。

    如果你用原生的UI控件,那让强大的runtime给你加喽

    - (void)setDict:(NSDictionary *)dict {objc_setAssociatedObject(self, dictKey, dict, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }- (NSDictionary *)dict {return objc_getAssociatedObject(self, dictKey);
    }

    总结

  4. 通过XXCoreActionManager,你可以做到无论你身在何处(哪一个controller),要到何处去(跳转到哪一个controller),你只需要叫来XXCoreActionManager,告诉它你的目的地(target)。你就可以做到想跳就跳。真正的 write once,use anywhere 。
  5. 针对各种有跳转功能的控件,可以做到真的解耦。只需要把它放到他需要显示的位置。告诉它对应的参数就可以了。方便复用和后期的维护。
  6. 这次想说的只是一个思路,代码很简单。其实可以使用的地方还有很多。不只是跳转各位童鞋可以自己思考。有什么不明白的可以留言,如果觉得那里不合适更欢迎留言指教或交流。

iOS开发之如何通过路由方式进行页面间的跳转相关推荐

  1. windows phone 8 使用页面传对象的方式 实现页面间的多值传递

    在做windows phone 开发的时候,会经常碰到页面间之间的跳转和传递数据,如果传递的值不多,只有两三个,我们通常使用NavigationService.Navigate(new Uri(&qu ...

  2. java中程序跳转_java程序中先后台交互的两种实现方式以及页面之间的跳转

    虽然如今市面上很流行先后端分离,可是在不少企业中仍是使用的是SSH框架,先后端不分离. 那么此类先后端有其自身独特的先后台交互的方式,可是也支持js/jquery.下面对这两种方式作一下概括.java ...

  3. iOS开发------仿知乎上下滑动切换页面

    放松的时候看看知乎,生活不解的时候问问知乎,这貌似已经成为了生活中的一种习惯,它独特翻页方式也是本人喜欢的一个原因,通过上划与下滑进行页面的翻页,不必返回再进入下一个页面,显得非常的简介并且人性化,这 ...

  4. iOS开发有关app启动时的动态页面展示(非启动页面)

    很多APP启动的时候,需要动态的更换启动页面,可以在这个地方增添广告或者是将APP中新加入的一些活动信息等展示给用户.废话不多说,上代码: 一般都是在AppDelegate中的这个方法进行实现,当然这 ...

  5. iOS开发之数据存储

    概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...

  6. iOS开发系列--数据存取

    原文地址为: iOS开发系列--数据存取 概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation ...

  7. iOS开发之数据存取

    本文转载至 http://www.cocoachina.com/ios/20141111/10190.html 2014-11-11 13:43 编辑:suiling 分类:iOS开发 来源:崔江涛( ...

  8. 文顶顶iOS开发博客链接整理及部分项目源代码下载

    网上的iOS开发的教程很多,但是像cnblogs博主文顶顶的博客这样内容图文并茂,代码齐全,示例经典,原理也有阐述,覆盖面宽广,自成系统的系列教程却很难找.如果你是初学者,在学习了斯坦福iOS7公开课 ...

  9. iOS开发的经典博客和文章汇总

    官方文档 马上着手开发 iOS 应用程序(官方) https://developer.apple.com/library/ios/referencelibrary/GettingStarted/Roa ...

最新文章

  1. 深入分析Nginx 502 Bad Gateway和Nginx 504 Gateway(亲测)
  2. Kitten编程猫的工程文件 bcm,能发布成Android平台的apk文件吗
  3. 钽电容极性 钽电容极性判断图解
  4. 再讨论下古老的include
  5. Embedding技术在推荐系统中的应用
  6. UVa 706 ZOJ 1146 LC-Display
  7. 算法第四版C++算法实现全集
  8. win10系统64位安装与配置java环境,安装使用citespace经验
  9. linux怎样判断vim是否安装上,Linux系统中vim的安装
  10. 笔记本电脑摄像头频闪问题,打开摄像头出现错误代码0xA00F4244(0xC00D36D5)的问题解决方法
  11. 决策树算法python源代码_决的意思
  12. Command rejected: Bad VLAN list
  13. 【uni-app】模仿微信实现简易发送/取发语音功能
  14. WinForm中使用Win10 蓝牙Ble Sdk
  15. 模型推荐丨新闻传播大数据项目案例模型分享
  16. 《软件测试常见面试题十二》
  17. docker nginx部署.net core后端站点和angular前端站点
  18. python类生成对象的操作叫做( )_Python——类和对象(一)
  19. 游戏编程精粹1-6分类目录之通用编程技术部分
  20. 【libobs】deps下的w32-pthreads动态库

热门文章

  1. 基于GA优化RBF神经网络(GA-RBF)数据预测的matlab仿真
  2. CCNA交换final考试
  3. Acwing222_青蛙的约会_同余方程
  4. 封装一个西游记人物类Person
  5. 2023年全国职业院校技能大赛网络系统管理赛项 正式赛项规程 GZ073
  6. 如何强制你的 MacBook 充满电
  7. JIRA里面的项目怎么改负责人
  8. 量化番外篇——TensorRT-8的量化细节
  9. H5,C3新特性,你值得拥有
  10. 对于12306铁路购票系统的评价