献给初学iOS的小盆友们——微博app项目开发之十显示昵称与最新微博数
2016-01-27 09:47
543 查看
鉴于好多网站在未经过我允许下就转载我的博客,真实很无奈啊,连最起码的原始链接都不配上,真是木有一点良心。但是我依然会把这个项目写下去,要对得起自己初衷,也要对得起观众,就是麻烦你们下次顺便把我博客链接也复制粘贴过去呗。况且这是个项目博客,只看一个两个根本没有意义啊,所以想学的盆友还是从一开始学起吧,保证你不后悔的。
上节课我们解决了Home首页的下部tabbar问题,这次我们就来解决首页上面导航条上的问题,一个是在中间标题按钮上显示用户的昵称,第二个就是在刷新微博后,弹出一个提示框来告诉用户刚才刷出了多少条新微博。每天学一点,是不是感觉很有成就感呢?
提示最新微博数
当你仔细研究这个请求方法所需要的参数模型和返回结果模型时,会发现其只需要一个Access token 和一个Uid,这个与YGUnreadMsgParam模型是一样。它的返回结果模型与YGUser模型也是类似的,且YGUser已经包含了name属性,我们直接拿来用即可。最后我们就只需要一个YGUserInfoTool就可以了,然后在其头文件定义如下方法:
这里我们发现其实YGUserInfoTool定义的方法与YGUnreadTool是类似的,如果你觉得这样定义太繁琐,你可以直接把刚才定义的方法加到YGUnread Tool内,节省了程序编译的时间,但是这里我为了让大家更清楚,就不再给代码搬家了。
然后我们就可以在YGHomeViewController内加上请求用户昵称的方法,我们在刚才的方法中得到YGUser模型后,可以直接在成功回调函数内设置标题按钮TitleButton 的标题为name。
可以看到因为我们之前就提前设置好了titleButton 为sizeToFit,所以不论name有多长,都可以正常显示。
但是我们在此运行项目后,仔细观察标题按钮的变化,会发现其标题首先显示为首页,然后再迅速转变为name内容。所以为了解决这个问题,我们可以在获取到name后保存到Account内,因为accout的内容会被归档到程序文件夹内,然后下次重新打开微博的时候,可以直接从保存的account.data内获取。但是为了防止当用户更改用户名时产生的错误,我们还是要每次都要从服务器内重新获取用户名。
所以我们首先在YGAccount内增加一个name属性,然后在encode内增加归档代码:
在decode内增加解档代码:
但是你有没有感觉着六行代码很垃圾,都是重复性内容,如果有一行代码直接帮我们做了归档解档该多好啊。不用着急,MJ大神想我们所想啊,我们在引入MJExtension文件后,增加一个宏即可替换我们的归档和解档方法:
然后把encode和decode方法注释掉即可。而且这里可以发现,我们之前设计的模型在程序开发过程中是可以根据需求进行更改的,而不是一成不变的,所以会经常回过头来找以前的代码,有个清晰的文件框架就显得很必要了。
然后我们需要在YGHomeViewController设置首页标题的时候就不能写死了,标题就要从之前保存的account文件内获取:
最后一步不要忘了在每次请求用户昵称后保存account信息,代码如下:
知道label是怎么运动的后,就需要考虑label加到哪个view 上。如果我们把label加到tableView上,就会发现,label会随着tableview的拖动而运动,所以应该加到导航控制器的view上,但是这里不使用addSubView,而是使用insertSubview方法,因为addSubView会覆盖导航条。
最后我们要判断在何时插入并显示label,如果你仔细玩一玩微博,会发现,当我们下拉刷新完成后,label就会开始显示,所以应该在loadNewStatus方法内添加关于label显示的代码。代码如下:
可以看到我们在loadNewStatus内抽取了一个专门用于显示label的方法,其定义为:
这里使用了系统自带的动画方法,应该比较容易理解。而且在label回到起始位置后,需要把其从父视图中移除掉。
本节我们又为微博增加了两个新的功能,下节课我们就开始修整修整展示微博内容的cell了,这个才是重头戏哦,千万不要错过。
上节课我们解决了Home首页的下部tabbar问题,这次我们就来解决首页上面导航条上的问题,一个是在中间标题按钮上显示用户的昵称,第二个就是在刷新微博后,弹出一个提示框来告诉用户刚才刷出了多少条新微博。每天学一点,是不是感觉很有成就感呢?
本节内容
显示用户昵称提示最新微博数
本节资料
第十节代码资料10.1 显示用户昵称
想要显示用户昵称,就需要获取用户信息,所以就咬再次查看获取用户信息的API,其接口如下:当你仔细研究这个请求方法所需要的参数模型和返回结果模型时,会发现其只需要一个Access token 和一个Uid,这个与YGUnreadMsgParam模型是一样。它的返回结果模型与YGUser模型也是类似的,且YGUser已经包含了name属性,我们直接拿来用即可。最后我们就只需要一个YGUserInfoTool就可以了,然后在其头文件定义如下方法:
[code]+(void)userInfoWithSuccess:(void (^)(YGUser *))success failure:(void (^)(NSError *))failure { YGUnreadMsgParam * param = [YGUnreadMsgParam param]; param.uid = [YGAccountTool account].uid; [YGHttpTool GET:@"https://api.weibo.com/2/users/show.json" parameters:param.mj_keyValues success:^(id responseObject) { //用户字典转用户模型 YGUser *user = [YGUser mj_objectWithKeyValues:responseObject]; if (success) { success(user); } } failure:^(NSError *error) { if (failure) { failure(error); } }]; }
这里我们发现其实YGUserInfoTool定义的方法与YGUnreadTool是类似的,如果你觉得这样定义太繁琐,你可以直接把刚才定义的方法加到YGUnread Tool内,节省了程序编译的时间,但是这里我为了让大家更清楚,就不再给代码搬家了。
然后我们就可以在YGHomeViewController内加上请求用户昵称的方法,我们在刚才的方法中得到YGUser模型后,可以直接在成功回调函数内设置标题按钮TitleButton 的标题为name。
[code]//请求当前用户昵称 [YGUserInfoTool userInfoWithSuccess:^(YGUser *user) { //请求当前帐号用户信息 //设置导航条标题 [self.titleButton setTitle:user.name forState:UIControlStateNormal]; } failure:^(NSError *error) { }];
可以看到因为我们之前就提前设置好了titleButton 为sizeToFit,所以不论name有多长,都可以正常显示。
但是我们在此运行项目后,仔细观察标题按钮的变化,会发现其标题首先显示为首页,然后再迅速转变为name内容。所以为了解决这个问题,我们可以在获取到name后保存到Account内,因为accout的内容会被归档到程序文件夹内,然后下次重新打开微博的时候,可以直接从保存的account.data内获取。但是为了防止当用户更改用户名时产生的错误,我们还是要每次都要从服务器内重新获取用户名。
所以我们首先在YGAccount内增加一个name属性,然后在encode内增加归档代码:
[code] [aCoder encodeObject:_name forKey:YGNameKey];
在decode内增加解档代码:
[code] _name = [aDecoder decodeObjectForKey:YGNameKey];
但是你有没有感觉着六行代码很垃圾,都是重复性内容,如果有一行代码直接帮我们做了归档解档该多好啊。不用着急,MJ大神想我们所想啊,我们在引入MJExtension文件后,增加一个宏即可替换我们的归档和解档方法:
[code]MJCodingImplementation
然后把encode和decode方法注释掉即可。而且这里可以发现,我们之前设计的模型在程序开发过程中是可以根据需求进行更改的,而不是一成不变的,所以会经常回过头来找以前的代码,有个清晰的文件框架就显得很必要了。
然后我们需要在YGHomeViewController设置首页标题的时候就不能写死了,标题就要从之前保存的account文件内获取:
[code] NSString* title= [YGAccountTool account].name?:@"首页"; [titleButton setTitle:title forState:UIControlStateNormal];
最后一步不要忘了在每次请求用户昵称后保存account信息,代码如下:
[code] //请求当前用户昵称 [YGUserInfoTool userInfoWithSuccess:^(YGUser *user) { //请求当前帐号用户信息 //设置导航条标题 [self.titleButton setTitle:user.name forState:UIControlStateNormal]; //获取当前帐号 YGAccount *account = [YGAccountTool account]; account.name=user.name; //保存用户名称 [YGAccountTool saveAccount:account]; } failure:^(NSError *error) { }];
10.2 提示最新微博数
玩过微博的同学应该知道,每当我们下拉刷新微博的时候,都会在导航条下面慢慢滑出来一个提示框,里面显示了更新了多少条微博。这个功能其实并不难做,只有有三点需要思考的地方。第一,确定提示框动画前后的位置,第二提示框加到哪个控制器上,第三在哪个方法里写代码。我们先一个个解决,首先我们可以很容易的知道需要用label控件显示提示内容,label的大小也容易知道,然后label一开始应该放在导航条的后面,然后慢慢滑动到导航条的正下方。然后再慢慢还原并消失。如图所示:知道label是怎么运动的后,就需要考虑label加到哪个view 上。如果我们把label加到tableView上,就会发现,label会随着tableview的拖动而运动,所以应该加到导航控制器的view上,但是这里不使用addSubView,而是使用insertSubview方法,因为addSubView会覆盖导航条。
最后我们要判断在何时插入并显示label,如果你仔细玩一玩微博,会发现,当我们下拉刷新完成后,label就会开始显示,所以应该在loadNewStatus方法内添加关于label显示的代码。代码如下:
[code]// 展示最新微博数 [self showNewStatusCount:(unsigned)statuses.count];
可以看到我们在loadNewStatus内抽取了一个专门用于显示label的方法,其定义为:
[code]-(void)showNewStatusCount:(int)count { if (count==0) { return ; } CGFloat h =35; CGFloat y = CGRectGetMaxY(self.navigationController.navigationBar.frame)-h; CGFloat x=0; CGFloat w = self.view.width; UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(x, y, w, h)]; label.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"timeline_new_status_background"]]; label.text = [NSString stringWithFormat:@"最新微博数%d",count]; label.textAlignment = NSTextAlignmentCenter; label.textColor = [UIColor whiteColor]; // 插入导航控制器的导航条下面 [self.navigationController.view insertSubview:label belowSubview:self.navigationController.navigationBar]; //动画平移 [UIView animateWithDuration:0.25 animations:^{ // 往下平移 label.transform = CGAffineTransformMakeTranslation(0, h); }completion:^(BOOL finished) { [UIView animateWithDuration:0.25 delay:1.25 options:UIViewAnimationOptionCurveLinear animations:^{ label.transform = CGAffineTransformIdentity; } completion:^(BOOL finished) { [label removeFromSuperview]; }]; }]; }
这里使用了系统自带的动画方法,应该比较容易理解。而且在label回到起始位置后,需要把其从父视图中移除掉。
本节我们又为微博增加了两个新的功能,下节课我们就开始修整修整展示微博内容的cell了,这个才是重头戏哦,千万不要错过。
相关文章推荐
- 如何免费看微信红包照片
- Android退出应用最优雅的方式(改进版)
- swift自学笔记(四)(懒加载、存储属性、计算属性、类属性、属性监听)
- Handler消息传递机制
- iOScell自适应高度
- 关于Android Studio导入.9图片报 ':app:mergeDebugResources'. > Some file crunching failed, see logs for detai
- Unity 读取文件 TextAsset读取配置文件
- Android线程管理(三)——Thread类的内部原理、休眠及唤醒
- View controller-based status bar appearance
- wap 前端开发--禁止页面滚动Android版 touchmove
- Ionic APP-Web SPA开发进阶(二)Ionic进阶之路由去哪了
- Ionic APP-Web SPA开发进阶(二)Ionic进阶之路由去哪了
- iOS 常用的图片压缩函数
- 强大的UI修改工具 UIAppearance
- IOS入门笔记之地理位置定位系统
- Ionic APP-Web SPA开发进阶(一)AngularJS全栈工程狮进阶
- Ionic APP-Web SPA开发进阶(一)AngularJS全栈工程狮进阶
- 简介Objective-C解析XML与JSON数据格式的方法
- 模仿微信摇一摇
- WebView相关