04-百思不得姐(第四天)

一、需求分析

今天需要完成的界面如下:

首先分析一下顶部的标签栏不同控制器中cell的差异,其实不管是哪一个标签,他们的cell都有共同的地方,就是下面标识出的位置!其cell无非是内容的差异!
04-百思不得姐(第四天)_第1张图片
所以接下来就先完成段子这个标签,后面的标签就完全照猫画虎了,让其都拥有同一种cell!

二、首先完成内容的显示


从整个界面看,无非就是tableView的那一套,创建模型->字典转模型->自定义cell->传递模型给cell->xib中添加需要显示的子控件->设置子控件显示的内容->设置上拉下拉。所以没什么好说的,主要说说几个注意点吧!

注意点:
1> 在昨天精华首页代码中的scrollViewDidEndScrollingAnimation方法中设置控制器的view,其中有些代码放在这个不是很合适,比如设置tableView的contentInset和scrollIndicatorInsets等属性,因为以后其他的标签控制器可能不是tableView,所以不能把tableView的属性在这里设置,而且放在对应控制器里面!同时设置tableView的其他属性!

- (void)setupTableView
{
    // 设置tableView的间距
    self.tableView.contentInset = UIEdgeInsetsMake(DSTitleViewH + DSTitleViewY, 0, self.tabBarController.tabBar.height, 0);
    self.tableView.scrollIndicatorInsets = self.tableView.contentInset;

    // 设置分割线和背景色
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    self.tableView.backgroundColor = [UIColor clearColor];

    // 注册cell
    [self.tableView registerNib:[UINib nibWithNibName:NSStringFromClass([DSTopicCell class]) bundle:nil] forCellReuseIdentifier:DSTopicCellIdentifier];

    self.tableView.rowHeight = 200;
}

2> 再就是要考虑page的问题,当我们下载下一页的问题时,page就需要+1,但是一旦加载失败,这个page就不应该+1。还有就是上一次推荐关注界面的问题,如果用户即下拉又上拉,所以我们应该只处理最后一次请求,还是老办法,设置params属性,然后判断。其实在接口这一块儿,有page这个属性的话,需要考虑很多繁琐的问题,如果后台接口是since_id(新浪微博就是这个接口)就好得多了,因为我们需要加载更新的数据,只需要把当前since_id最大值传进去就行,加载更多也是如此!

三、发表时间的处理

对于时间的处理是这样的:
04-百思不得姐(第四天)_第2张图片

首先对于时间的判断代码我们可以写在模型里面,重写创建时间created_at的get方法!

- (NSString *)created_at
{

    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];

    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";

    // 日历对象
    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;

    // 创建时间
    NSDate *createdDate = [fmt dateFromString:_created_at];
    // 现在时间
    NSDate *nowDate = [NSDate date];

    // 比较两个时间的差值
    NSDateComponents *cmps = [calendar components:unit fromDate:createdDate toDate:nowDate options:0];

    if ([createdDate isThisYear]) { // 今年

        if ([createdDate isYesterday]) { // 昨天
            fmt.dateFormat = @"昨天 HH:mm";
            return [fmt stringFromDate:createdDate];

        }else if ([createdDate isToday]) { // 今天

            if (cmps.hour < 1) { // 小于一小时
                if (cmps.minute < 1) {
                    return @"刚刚";
                }else { // 1分钟~59分钟
                    return [NSString stringWithFormat:@"%zd分钟前", cmps.minute];
                }

            }else { // 大于一小时
                return [NSString stringWithFormat:@"%zd小时前", cmps.hour];
            }

        }else { // 今年其他天
            fmt.dateFormat = @"MM-dd HH:mm";
            return [fmt stringFromDate:createdDate];
        }

    }else { // 非今年
        fmt.dateFormat = @"yyyy-MM-dd HH:mm";
        return [fmt stringFromDate:createdDate];
    }
}

对于如何比较时间,主要就是用到NSCalendar这个类,调用该类的方法,可以比较两个时间之间的差值,然后根据差值来判断该如何显示!

四、子控制器重构

接下来的需求就是让其他的界面和topic的界面一样显示,其实这很好完成,完全可以把topic控制器里面的代码复制到其他控制器,然后改掉其类名,把type类型设置为对应的type,就可以完成显示了,但是从代码角度考虑这样无疑是很糟糕的,因为我们完全可以代码复用,把相同的代码抽在一起,然后传递不同的type参数即可!

所以我们就创建一个基础类(DSBaseViewController)来完成!
在.h文件中,提供一个DSBaseType枚举属性

typedef enum {
    DSBaseTypeAll = 1, // 全部
    DSBaseTypePicture = 10, // 图片
    DSBaseTypeTopic = 29, // 段子
    DSBaseTypeVoice = 31, // 声音
    DSBaseTypeVideo = 41 // 视频
} DSBaseType;
/** * 标签类型 */
@property (nonatomic, assign) DSBaseType type;

然后把段子里面的代码复制过来,设置params里面type参数为self.type。

然后在精华首页控制器的设置子控制器(setupChildVc)方法中,设置对应控制器的type属性

所以之前创建的其他控制器就可以Move To Transh!

你可能感兴趣的:(项目,百思不得姐)