献给初学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了,这个才是重头戏哦,千万不要错过。

0 0