您的位置:首页 > 移动开发

献给初学iOS的小盆友们——微博app项目开发之十显示昵称与最新微博数

2016-01-27 09:47 543 查看
鉴于好多网站在未经过我允许下就转载我的博客,真实很无奈啊,连最起码的原始链接都不配上,真是木有一点良心。但是我依然会把这个项目写下去,要对得起自己初衷,也要对得起观众,就是麻烦你们下次顺便把我博客链接也复制粘贴过去呗。况且这是个项目博客,只看一个两个根本没有意义啊,所以想学的盆友还是从一开始学起吧,保证你不后悔的。

上节课我们解决了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了,这个才是重头戏哦,千万不要错过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: