Coding-iOS 的根视图分析
来源:互联网 发布:凯文乐福数据 编辑:程序博客网 时间:2024/06/07 16:10
前面分析了应用启动时引导动画的展示过程,动画结束后根据会跳转到登录或者注册界面(LoginViewController/RegisterViewController,另外我发现在连续登陆失败3次之后会出现验证码的输入框,关于登录过程后续再进行分析),当用户登录完成之后会进入RootTabViewController视图,该控制器里面依次加载了五个RootViewController(项目、任务、冒泡、消息和Me,其中的Me指的是用户)。RootTabViewController继承自第三方库RDVTabBarController,这个库的用法类似于UITabBarController,可以通过底部的标签项来切换上面说到的五个RootViewController。
目录
按以下几部分展开:
- 目录
- 介绍RootTabViewController
介绍RootTabViewController
首先看到重写了- (id)initWithNibName: bundle: 方法(但是没有添加内容,只是调用了父类的该方法)。然后可以看到- (void)viewDidLoad调用了- (void)setupViewControllers方法,这个是我们关注的重点。
setupViewControllers方法添加了5个五个RootViewController,并且定制了屏幕底部的标签栏(设置标签项在不同状态下的图标和背景图片)。
- (void)setupViewControllers { // 加载Project_RootViewController Project_RootViewController *project = [[Project_RootViewController alloc] init]; ... ... /* 以Project_RootViewController为根视图控制器, 初始化一个导航控制器 */ UINavigationController *nav_project = [[BaseNavigationController alloc] initWithRootViewController:project]; // 加载MyTask_RootViewController 和 Tweet_RootViewController MyTask_RootViewController *mytask = [[MyTask_RootViewController alloc] init]; UINavigationController *nav_mytask = [[BaseNavigationController alloc] initWithRootViewController:mytask]; RKSwipeBetweenViewControllers *nav_tweet = [RKSwipeBetweenViewControllers newSwipeBetweenViewControllers]; [nav_tweet.viewControllerArray addObjectsFromArray:@[[Tweet_RootViewController newTweetVCWithType:Tweet_RootViewControllerTypeAll], [Tweet_RootViewController newTweetVCWithType:Tweet_RootViewControllerTypeFriend], [Tweet_RootViewController newTweetVCWithType:Tweet_RootViewControllerTypeHot]]]; nav_tweet.buttonText = @[@"冒泡广场", @"朋友圈", @"热门冒泡"]; // 加载Message_RootViewController Message_RootViewController *message = [[Message_RootViewController alloc] init]; ... ... UINavigationController *nav_message = [[BaseNavigationController alloc] initWithRootViewController:message]; // 加载Message_RootViewController Me_RootViewController *me = [[Me_RootViewController alloc] init]; me.isRoot = YES; UINavigationController *nav_me = [[BaseNavigationController alloc] initWithRootViewController:me]; /* 将需要被管理的多个UIViewController组合成NSArray对象, 将这个NSArray对象设置成 RDVTabBarController的viewController属性, 这样就可以通过RDVTabBarController来切换显示多个UIViewController */ [self setViewControllers:@[nav_project, nav_mytask, nav_tweet, nav_message, nav_me]]; [self customizeTabBarForController]; self.delegate = self;}
另外,可以注意到该方法(setupViewControllers)中用到了ReactiveCocoa 框架(基于响应式编程思想),关于这个框架的使用介绍,我找了几篇写的比较详细的文章:《ReactiveCocoa入门教程》 和 《ReactiveCocoa框架菜鸟入门》 ,可以参考一下。
/* RACObserve(TARGET, KEYPATH) 观察TARGET的KEYPATH属性,相当于KVO,产生一个RACSignal *//* 使用combineLatest:reduce:方法 产生聚合信号(此处只有一个信号), 当该聚合信号产生一个新值时,reduce: block 会执行, block的返回值会赋值给project对象的badgeValue属性 */RAC(project, rdv_tabBarItem.badgeValue) = [RACSignal combineLatest:@[RACObserve([UnReadManager shareManager], project_update_count)] reduce:^id(NSNumber *project_update_count){ return project_update_count.integerValue > 0? kBadgeTipStr : @""; }];
关于定制屏幕底部标签栏的方法的使用可以参考RDVTabBarController库的github说明,在本应用中的使用情况分析如下:
- (void)customizeTabBarForController { //定制标签条(设置标签项在不同状态下的背景图片和图标) UIImage *backgroundImage = [UIImage imageNamed:@"tabbar_background"]; NSArray *tabBarItemImages = @[@"project", @"task", @"tweet", @"privatemessage", @"me"]; NSArray *tabBarItemTitles = @[@"项目", @"任务", @"冒泡", @"消息", @"我"]; NSInteger index = 0; for (RDVTabBarItem *item in [[self tabBar] items]) { item.titlePositionAdjustment = UIOffsetMake(0, 3); /* 设置标签项在选中和未选中状态下分别对应的背景图片 */ [item setBackgroundSelectedImage:backgroundImage withUnselectedImage:backgroundImage]; /* 设置标签项在选中和未选中状态下分别对应的图标 */ /* 以index=1为例, 查找名为 project_selected 的图片(其中的 "%@" 表示NSArray返回指定index的对象) */ /* 图片 project_selected 位于 "image/tabbar/" 目录下 */ UIImage *selectedimage = [UIImage imageNamed:[NSString stringWithFormat:@"%@_selected", [tabBarItemImages objectAtIndex:index]]]; UIImage *unselectedimage = [UIImage imageNamed:[NSString stringWithFormat:@"%@_normal", [tabBarItemImages objectAtIndex:index]]]; [item setFinishedSelectedImage:selectedimage withFinishedUnselectedImage:unselectedimage]; [item setTitle:[tabBarItemTitles objectAtIndex:index]]; index++; }}
RootTabViewController的根视图为Project_RootViewController,因此默认显示的是项目视图,可以通过底部的5个标签栏来进行切换。
对于顶部的搜索栏、”+”号按钮,则是在Project_RootViewController中定义的,关于项目根视图控制器的理解后面在进行分析。
- Coding-iOS 的根视图分析
- IOS 应用视图对象的清理分析
- iOS presentViewController两个视图控制器的时候返回根视图
- iOS返回根视图、特定视图的方法
- GitHub & Bitbucket & GitLab & Coding 的对比分析
- IOS中根视图控制器的剖析
- UINaviewgationController的视图分析
- iOS的视图深入浅出
- ios--视图的基本概念
- iOS 视图的生命周期
- iOS视图的生命周期
- iOS视图的生命周期
- 关于iOS父(容器)视图控制器管理子视图控制器的根视图的思考总结
- iOS 【IOS中Key-Value Coding (KVC)的使用详解】
- ios 切换根视图
- IOS 返回根视图
- IOS 应用创建一个视图对象分析
- IOS 应用视图交互模型分析
- Android中的Fragment——01(Fragment的静态加载)
- memcached的使用
- SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法
- 梯度、散度与旋度
- ubuntu16.04安装monaco字体
- Coding-iOS 的根视图分析
- 371. Sum of Two Integers--LeetCode Record
- pushlet 之 Pushlet使用手把手实例
- Java--关键字
- hive数据仓库图
- A+B高精度问题
- hdu 5020 Revenge of Collinearity(STL,组合,思路)
- 10001---使用 Filter 作为控制器的 MVC
- 矩阵范数