如何优雅的进行页面间的跳转
来源:互联网 发布:淘宝多少钱免运费 编辑:程序博客网 时间:2024/05/16 14:50
如何优雅的进行页面间的跳转
在你的开发过程中,是否遇到过如下的需求:
- 在tableView类型的展示列表中,点击每个cell中人物头像都可以跳转到人物详情,可参见微博中的头像,同理包括转发、评论按钮、各种链接及linkcard。
- 跳转到任意页面
- 产品要求,某个页面的不同banner图,点击可以跳转到任何一个页面,可能是原生的页面A、页面B,或者是web页C。
- 在web页面,可以跳转到任何一个原生页面。
- 在远程推送中跳转到任意指定的页面。
以上2种需求,我想大多数开发者都遇到过,并且可以实现这种功能。毕竟,这是比较基础的功能。但是代码未必那么优雅。
一般处理办法
针对1.
,一般初学者会用target或者block等方法在tableView的代理方法拿到事件,并把要执行的跳转写到controller里。功能是可以实现的,但问题是这种cell及相似的cell(布局有些变化,或者多几个少几个控件)一般出现在多个页面。这样的话相同的代码就会出现在多个地方。就算把跳转方法抽取出来写成category,但是target或者block总是每个地方都要写的。
针对2.
,初级的方法是每个地方写一坨判断及跳转,高级一些是抽取出来写在基类或者category。
优雅的解决办法
纵观上面各种情况,总结起来就是一句话,在任意的地方触发事件(可以是推送,拦截的js跳转,各种控件的点击事件)可以跳转到任意界面。
所以我们可以统一用一个控制跳转的manager来完成跳转。
与后端约定好数据结构,例如:
12
NSDictionary *target = @{@"action" : @"user", @"data" : @{@"user_id" : @(123456)}};
就是跳转到id为123456的用户页面,如果跳转需要更多的数据,可以在data的value里面继续添加。
创建一个用来跳转的类,可以起的牛x的名字,XXCoreActionManager。
创建一个类方法:12345678910111213141516171819202122232425
+ (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
等。服务器只需要传入相应的数据就可以用1
[XXCoreActionManager doActionForTarget:target];
来进行跳转。真正的
write once,use anywhere
针对头像、评论、转发等多处使用的子控件,可以把事件由自己接收,通过XXCoreActionManager来进行跳转。即做到了代码分离,使之成为真正独立的控件,便于复用。
下面是一个简单例子:
123456789101112
@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给你加喽
1234567
- (void)setDict:(NSDictionary *)dict { objc_setAssociatedObject(self, dictKey, dict, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}- (NSDictionary *)dict { return objc_getAssociatedObject(self, dictKey);}
总结
- 通过XXCoreActionManager,你可以做到无论你身在何处(哪一个controller),要到何处去(跳转到哪一个controller),你只需要叫来XXCoreActionManager,告诉它你的目的地(target)。你就可以做到想跳就跳。真正的
write once,use anywhere
。 - 针对各种有跳转功能的控件,可以做到真的解耦。只需要把它放到他需要显示的位置。告诉它对应的参数就可以了。方便复用和后期的维护。
- 这次想说的只是一个思路,代码很简单。其实可以使用的地方还有很多。不只是跳转各位童鞋可以自己思考。有什么不明白的可以留言,如果觉得那里不合适更欢迎留言指教或交流。
写在后面的废话
从读大学接触到计算机技术这一领域,我就被这个圈子的氛围深深的触动了,这是一个如此自由、分享、开放的圈子。我从无数人的的分享中汲取着知识(开源的代码,分享的博客),我受益于这种环境,我就想对它做出回馈,写出这篇文章,即希望能帮助一些人,也希望能与大家有更多的交流。最后,谢谢那些无私的做出各种奉献的人。
- 如何优雅的进行页面间的跳转
- 如何优雅的进行页面间的跳转
- 如何优雅地进行页面间的跳转(iOS)
- 如何优雅地进行页面间的跳转(iOS)
- iOS开发之如何通过路由方式进行页面间的跳转
- 如何优雅的实现界面跳转 之 统跳协议
- 用锚点进行HTML页面内容的跳转
- 使用react-router-dom优雅的实现页面(路由)跳转, 而且保持当前页面状态
- 如何在调试页面的时候优雅的关闭缓存
- TableViewCell 里面嵌的TableViewCell 如何点击里面的TableViewCell进行页面跳转?
- 如何通过svn,git进行优雅的代码集成
- 数据库杂谈之:如何优雅的进行表结构设计
- 如何实现点击UITableViewCell中的控件,能调用到所在的ViewController对象进行页面跳转
- 如何实现点击a标签当所要跳转的页面加载完成后在进行跳转
- 如何优雅的大学生活
- 如何优雅的提问
- frameset如何实现整个页面的跳转
- frameset如何实现整个页面的跳转
- “哎哟!蛮吊的” 之 Android Service图形总结
- CodeForces 340D - Bubble Sort Graph
- hdoj 3416 Marriage Match IV 【最大流 + 最短路】
- http://user.qzone.qq.com/1467400757/blog/1414135584
- Mac OS 终端起动、关闭、重启apache的方法
- 如何优雅的进行页面间的跳转
- 视频编辑软件编辑星海外英文网站上线
- XHTML
- 区间dp poj3280 Cheapest Palindrome
- Java设计模式之工厂模式
- Android 选择图片裁剪,上传
- 启航
- 2015-07-28
- 视频编辑软件编辑星海外英文网站上线