你的位置:首页 > 操作系统

[操作系统]cell业务逻辑处理(时间格式化)


一.点击更多按钮
1.项目需求
     点击更多按钮,从底部弹出一个框 

 


2.怎么从底部弹出一个框?
          两种方法:      
          一种用 UIActionSheet
          另一种用 UIAlertController
     
     2.1 使用UIActionSheet
          好处: 不需要控制器,直接就能使用
          缺点: 方法过期了,监听按钮的点击比较麻烦
 
     源代码:
// 以后只要发现有可变参数,最后一定要添加nil
UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"收藏",@"举报",nil];
 
[sheet showInView:self];
 
     2.2 使用UIAlertController
          好处:能方法监听按钮的点击
          缺点:代码要写很多,依赖控制器(需要控制器modal出来)
     
     2.3 使用UIAlertController需要使用通知,通知最近的控制器把UIAlertController   modal出来
          注意:使用通知,当控制器销毁的时候,一定要移除通知
     
     2.4 为什么使用通知,不使用代理?
          通知可以跨级传递消息
          代理,一般是上下级来传递消息
          
3.怎么能快速拿到一个控制器?
     全局有一个单例 UIApplication,通过这个单例我们能拿到窗口的跟控制器
      // 以后只要想快速拿控制器,拿窗口根控制器
    [UIApplication sharedApplication].keyWindow.rootViewController;
 
二.发布帖子的时间处理
 
1.时间处理的业务逻辑分析
     1.1先判断是否是今年的帖子,如果不是今年,就显示  2015-08-06 21:10:08 这种格式
 
     1.2如果是今年,在判断是否是今天,如果是今天   在判断有没有超过一个小时,超过一个小时 就显示 多少小时前 这种格式
 
     1.3如果不超过一小时,判断有没有超过2分钟 超过两分钟 就显示  多少分钟前 这种格式
 
     1.4 如果不超过两分钟,就显示 刚刚  这种格式
 
     1.5 如果时间超过一天,在判断有没有超过一天 如果没有 就显示  昨天 21:10这种格式
 
     1.6 如果时间超过一天 就显示  08-05 21:10:08这种格式
 
2.由于业务逻辑非常深,写代码的时候,容易搞混,怎么处理?
     我们可以采取先写伪代码,理清思路,再转换为真实代码
     什么是伪代码:伪代码就是中文和代码的结合写出来的代码
 
伪代码实例
 // 处理时间(用帖子发布时间与当前时间比较)
    if (今年) {
        if (今天) {
           
            if (大于1小时) {
               
            } else if (大于2分钟) {
               
            } else { // 刚刚
               
            }
           
        } else if (昨天) {
           
        } else { // 昨天之前
           
        }
       
    } else{ // 非今年
       
    }
 
3.怎么获取时间差值?
     3.1 先把字符串对象的日期转换成 日期对象的日期格式
          3.1.1 获取 NSDateFormatter对象,用来 NSStreing与NSDate互转
          3.1.2 设置日期格式(转换成什么格式的日期)
          3.1.3 把字符串日期, 转换成特定格式的日期
 
4.判断是否是今年
     4.1 怎么判断?
          判断年份是否相同
 
     4.2 怎么获取日期年份,或月份,等等?
          可以通过日历类来拿到日期组件,就可以获得年,月日和时分秒了
 
处理日期格式原码
 
   
 1 // 1.把帖子发布时间字符串转换成(NSDate)日期对象 => NSDateFormatter 2   // NSDateFormatter:NSStreing与NSDate互转 3   NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; 4   // 设置格式 5   fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss"; 6   // 发布日期对象 7   NSDate *createDate = [fmt dateFromString:item.create_time]; 8    9   // 获取日历类对象10  // NSCalendar *calendar = [NSCalendar currentCalendar];11   // 获取日期组件12  // NSDateComponents *cmp = [calendar components:NSCalendarUnitHour | NSCalendarUnitMinute fromDate:createDate toDate:[NSDate date] options:NSCalendarWrapComponents];13  14   NSString *timeStr = item.create_time;15   if ([createDate isThisYear]) { 16     if ([createDate isThisToday]) {17      18       // 获取日期差值19       if (cmp.hour >= 1) {20         timeStr = [NSString stringWithFormat:@"%ld小时前",cmp.hour];21       } else if (cmp.minute >= 2) {22         timeStr = [NSString stringWithFormat:@"%ld分钟前",cmp.minute];23       } else { // 刚刚24         timeStr = @"刚刚";25       }  26     } else if ([createDate isThisYesterday]) { // 昨天27       // 昨天 21:1028       fmt.dateFormat = @"昨天 HH:mm";29       timeStr = [fmt stringFromDate:createDate];30  31     } else { // 昨天之前 08-05 21:10:0832       fmt.dateFormat = @"MM-dd HH:mm:ss";33       timeStr = [fmt stringFromDate:createDate];34     }35   }36 37 因为判断日期要常用,我们就把判断方法抽取到NSDate的分类38 39 - (BOOL)isThisYear40 {41   // 获取当前日期对象42   NSDate *curDate = [NSDate date]; 43   // 获取日历类44   NSCalendar *curCalendar = [NSCalendar currentCalendar];45   // 获取自己日期组件(年,月,等)  self代码外面调用这个方法的日历类(也就是createDate)46   NSDateComponents *selfCmp = [curCalendar components:NSCalendarUnitYear fromDate:self];47   // 获取当前时间日期组件(年,月,等)48   NSDateComponents *curCmp = [curCalendar components:NSCalendarUnitYear fromDate:curDate];49   return curCmp.year == selfCmp.year;50 }51 52 // 判断是否是今天53 - (BOOL)isThisToday54 {55   // 获取日历类56   NSCalendar *curCalendar = [NSCalendar currentCalendar];57   return [curCalendar isDateInToday:self];58 }59 60 - (BOOL)isThisYesterday61 {62   NSCalendar *curCalendar = [NSCalendar currentCalendar];63   return [curCalendar isDateInYesterday:self];64 }