献给初学iOS的小盆友们——微博app项目开发之十显示昵称与最新微博数
来源:互联网 发布:java获取资源文件路径 编辑:程序博客网 时间:2024/04/28 13:29
鉴于好多网站在未经过我允许下就转载我的博客,真实很无奈啊,连最起码的原始链接都不配上,真是木有一点良心。但是我依然会把这个项目写下去,要对得起自己初衷,也要对得起观众,就是麻烦你们下次顺便把我博客链接也复制粘贴过去呗。况且这是个项目博客,只看一个两个根本没有意义啊,所以想学的盆友还是从一开始学起吧,保证你不后悔的。
上节课我们解决了Home首页的下部tabbar问题,这次我们就来解决首页上面导航条上的问题,一个是在中间标题按钮上显示用户的昵称,第二个就是在刷新微博后,弹出一个提示框来告诉用户刚才刷出了多少条新微博。每天学一点,是不是感觉很有成就感呢?
本节内容
- 显示用户昵称
- 提示最新微博数
本节资料
第十节代码资料
10.1 显示用户昵称
想要显示用户昵称,就需要获取用户信息,所以就咬再次查看获取用户信息的API,其接口如下:
当你仔细研究这个请求方法所需要的参数模型和返回结果模型时,会发现其只需要一个Access token 和一个Uid,这个与YGUnreadMsgParam模型是一样。它的返回结果模型与YGUser模型也是类似的,且YGUser已经包含了name属性,我们直接拿来用即可。最后我们就只需要一个YGUserInfoTool就可以了,然后在其头文件定义如下方法:
+(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。
//请求当前用户昵称 [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内增加归档代码:
[aCoder encodeObject:_name forKey:YGNameKey];
在decode内增加解档代码:
_name = [aDecoder decodeObjectForKey:YGNameKey];
但是你有没有感觉着六行代码很垃圾,都是重复性内容,如果有一行代码直接帮我们做了归档解档该多好啊。不用着急,MJ大神想我们所想啊,我们在引入MJExtension文件后,增加一个宏即可替换我们的归档和解档方法:
MJCodingImplementation
然后把encode和decode方法注释掉即可。而且这里可以发现,我们之前设计的模型在程序开发过程中是可以根据需求进行更改的,而不是一成不变的,所以会经常回过头来找以前的代码,有个清晰的文件框架就显得很必要了。
然后我们需要在YGHomeViewController设置首页标题的时候就不能写死了,标题就要从之前保存的account文件内获取:
NSString* title= [YGAccountTool account].name?:@"首页"; [titleButton setTitle:title forState:UIControlStateNormal];
最后一步不要忘了在每次请求用户昵称后保存account信息,代码如下:
//请求当前用户昵称 [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显示的代码。代码如下:
// 展示最新微博数[self showNewStatusCount:(unsigned)statuses.count];
可以看到我们在loadNewStatus内抽取了一个专门用于显示label的方法,其定义为:
-(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了,这个才是重头戏哦,千万不要错过。
- 献给初学iOS的小盆友们——微博app项目开发之十显示昵称与最新微博数
- 献给初学iOS的小盆友们——微博app项目开发之二自定义tabBar
- 献给初学iOS的小盆友们——微博app项目开发之三设置导航条
- 献给初学iOS的小盆友们——微博app项目开发之四设置导航功能
- 献给初学iOS的小盆友们——微博app项目开发之五新特性界面
- 献给初学iOS的小盆友们——微博app项目开发之六OAuth授权
- 献给初学iOS的小盆友们——微博app项目开发之八封装代码
- 献给初学iOS的小盆友们——微博app项目开发之十五微博配图
- 献给初学iOS的小盆友们——微博app项目开发之七第一次获取微博数据
- 献给初学iOS的小盆友们——微博app项目开发之九未读数设置以及后台播放
- 献给初学iOS的小盆友们——微博app项目开发之十一自定义cell和MVVM模式
- 献给初学iOS的小盆友们——微博app项目开发之十二自定义cell代码补全
- 献给初学iOS的小盆友们——微博app项目开发之十三微博时间和来源处理
- 献给初学iOS的小盆友们——微博app项目开发之十六搭建发送微博界面(上)
- 献给初学iOS的小盆友们——微博app项目开发之十七搭建发送微博界面(中)
- 献给初学iOS的小盆友们——微博app项目开发之十八搭建发送微博界面(下)
- 献给初学iOS的小盆友们——微博app项目开发之十四转发微博修正以及添加微博工具条
- 献给初学iOS的小盆友们------微博app项目开发之一项目初始化
- poj 3254 Corn Fields (状态压缩dp)
- Hadoop集群中SSH免密码登录
- URL短地址---实现方案收集
- amfe手机淘宝前端团队 https://github.com/amfe
- 仿新浪微博手机客户端呼出菜单
- 献给初学iOS的小盆友们——微博app项目开发之十显示昵称与最新微博数
- 如何优化在Ubuntu手机中的QML应用
- 设置 tabBar 下面文字和图片颜色
- PL/SQL导入Oracle sql脚本
- JS面向对象及组件开发
- 做一次完美的用户调研
- 跨域请求
- iOS-彻底了解iOS字体相关知识
- 给想当程序员的大学生的一点建议