zoukankan      html  css  js  c++  java
  • ios--时间格式化(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:10
    28             fmt.dateFormat = @"昨天 HH:mm";
    29             timeStr = [fmt stringFromDate:createDate];
    30    
    31         } else { // 昨天之前 08-05 21:10:08
    32             fmt.dateFormat = @"MM-dd HH:mm:ss";
    33             timeStr = [fmt stringFromDate:createDate];
    34         }
    35     }
    36  
    37 因为判断日期要常用,我们就把判断方法抽取到NSDate的分类
    38  
    39 - (BOOL)isThisYear
    40 {
    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)isThisToday
    54 {
    55     // 获取日历类
    56     NSCalendar *curCalendar = [NSCalendar currentCalendar];
    57     return [curCalendar isDateInToday:self];
    58 }
    59 
    60 - (BOOL)isThisYesterday
    61 {
    62     NSCalendar *curCalendar = [NSCalendar currentCalendar];
    63     return [curCalendar isDateInYesterday:self];
    64 }
     
     
  • 相关阅读:
    Maven: 每次更新Maven Project ,JAVA 版本都变为1.5 规格严格
    OpenFeign 出现The bean xxx.FeignClientSpecification could not be registered问题解决 规格严格
    富文本编辑保存的时候报错Data truncation: Data too long for column 'content' at row 1 规格严格
    cPickle.so:: PyUnicodeUCS2_DecodeUTF8 规格严格
    Poitl Documentation 规格严格
    maven指定编译版本 规格严格
    SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型
    SQL Server 2008空间数据应用系列四:基础空间对象与函数应用
    SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础
    SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型
  • 原文地址:https://www.cnblogs.com/xiaotian666/p/5760798.html
Copyright © 2011-2022 走看看