一.点击更多按钮
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.把帖子发布时间字符串转换成(NSDate)日期对象 => NSDateFormatter
// NSDateFormatter:NSStreing与NSDate互转
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
// 设置格式
fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
// 发布日期对象
NSDate *createDate = [fmt dateFromString:item.create_time]; // 获取日历类对象
// NSCalendar *calendar = [NSCalendar currentCalendar];
// 获取日期组件
// NSDateComponents *cmp = [calendar components:NSCalendarUnitHour | NSCalendarUnitMinute fromDate:createDate toDate:[NSDate date] options:NSCalendarWrapComponents]; NSString *timeStr = item.create_time;
if ([createDate isThisYear]) {
if ([createDate isThisToday]) { // 获取日期差值
if (cmp.hour >= ) {
timeStr = [NSString stringWithFormat:@"%ld小时前",cmp.hour];
} else if (cmp.minute >= ) {
timeStr = [NSString stringWithFormat:@"%ld分钟前",cmp.minute];
} else { // 刚刚
timeStr = @"刚刚";
}
} else if ([createDate isThisYesterday]) { // 昨天
// 昨天 21:10
fmt.dateFormat = @"昨天 HH:mm";
timeStr = [fmt stringFromDate:createDate]; } else { // 昨天之前 08-05 21:10:08
fmt.dateFormat = @"MM-dd HH:mm:ss";
timeStr = [fmt stringFromDate:createDate];
}
} 因为判断日期要常用,我们就把判断方法抽取到NSDate的分类 - (BOOL)isThisYear
{
// 获取当前日期对象
NSDate *curDate = [NSDate date];
// 获取日历类
NSCalendar *curCalendar = [NSCalendar currentCalendar];
// 获取自己日期组件(年,月,等) self代码外面调用这个方法的日历类(也就是createDate)
NSDateComponents *selfCmp = [curCalendar components:NSCalendarUnitYear fromDate:self];
// 获取当前时间日期组件(年,月,等)
NSDateComponents *curCmp = [curCalendar components:NSCalendarUnitYear fromDate:curDate];
return curCmp.year == selfCmp.year;
} // 判断是否是今天
- (BOOL)isThisToday
{
// 获取日历类
NSCalendar *curCalendar = [NSCalendar currentCalendar];
return [curCalendar isDateInToday:self];
} - (BOOL)isThisYesterday
{
NSCalendar *curCalendar = [NSCalendar currentCalendar];
return [curCalendar isDateInYesterday:self];
}
 

ios--时间格式化(cell业务逻辑处理)的更多相关文章

  1. 用适配器模式处理复杂的UITableView中cell的业务逻辑

    用适配器模式处理复杂的UITableView中cell的业务逻辑 适配器是用来隔离数据源对cell布局影响而使用的,cell只接受适配器的数据,而不会与外部数据源进行交互. 源码: ModelCell ...

  2. iOS开发---业务逻辑

    iOS开发---业务逻辑   1. 业务逻辑 iOS的app开发的最终目的是要让用户使用, 用户使用app完成自己的事就是业务逻辑, 业务逻辑的是最显眼开发工作.但是业务逻辑对于开发任务来说, 只是露 ...

  3. iOS登录及token的业务逻辑

    登录的业务逻辑 { http:是短连接. 服务器如何判断当前用户是否登录? // 1. 如果是即时通信类:长连接. // 如何保证服务器跟客户端保持长连接状态? // "心跳包" ...

  4. iOS 获取当前时间格式化字符串

    iOS 获取当前时间格式化字符串 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保 ...

  5. js时间格式化函数(兼容IOS)

    * 时间格式化 * @param {Object} dateObj 时间对象 * @param {String} fmt 格式化字符串 */ dateFormat(dateObj, fmt) { le ...

  6. 翻译:使用 ASP.NET MVC 4, EF, Knockoutjs and Bootstrap 设计和开发站点 - 6 - 业务逻辑

    Part 3: 设计逻辑层:核心开发 如前所述,我们的解决方案如下所示: 下面我们讨论整个应用的结构,根据应用中不同组件的逻辑相关性,分离到不同的层中,层与层之间的通讯通过或者不通过限制.分层属于架构 ...

  7. 9.1.3 .net framework通过业务逻辑层自动生成WebApi的做法

    首先需要说明的是这是.net framework的一个组件,而不是针对.net core的.目前工作比较忙,因此.net core的转换正在编写过程中,有了实现会第一时间贴出来. 接下来进入正题.对于 ...

  8. ASP.NET MVC5 网站开发实践(一) - 框架(续) 模型、数据存储、业务逻辑

    上次搭建好了项目框架,但还是觉得不太对劲,后来才想起来没有对开发目标进行定位,这个小demo虽然不用做需求分析,但是要实现什么效果还得明确.后来想了一下就做个最简单的网站,目标定为小公司进行展示用的网 ...

  9. 从零开始,搭建博客系统MVC5+EF6搭建框架(1),EF Code frist、实现泛型数据仓储以及业务逻辑

    前言      从上篇30岁找份程序员的工作(伪程序员的独白),文章开始,我说过我要用我自学的技术,来搭建一个博客系统,也希望大家给点意见,另外我很感谢博客园的各位朋友们,对我那篇算是自我阶段总结文章 ...

随机推荐

  1. 【BZOJ】2595: [Wc2008]游览计划

    题意 \(n * m\)的网格,如果\(a_{i, j} = 0\)则表示景点,否则表示这里的需要的志愿者人数.求一种安排志愿者的方案使得所有景点连通且志愿者最少. 分析 本题可以插头dp,然而有一个 ...

  2. 【BZOJ】2563: 阿狸和桃子的游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=2563 题意:给一个n个加权点m条加权边的无向图,两个人轮流拿走一个点,最后使先手得分-后手得分尽量大 ...

  3. Html5_移动前端不得不了解的html5 head 头标签

    移动前端不得不了解的html5 head 头标签   本文主要内容来自一丝的常用的 HTML 头部标签和百度FEX的HTML head 头标签. 移动端的工作已经越来越成为前端工作的重要内容,除了平常 ...

  4. DOM的概念及子节点类型【转】

    前言 DOM的作用是将网页转为一个javascript对象,从而可以使用javascript对网页进行各种操作(比如增删内容).浏览器会根据DOM模型,将HTML文档解析成一系列的节点,再由这些节点组 ...

  5. ng-repeat 指令

    <!--索引属性:$index,$first,$middle,$last--> <!--样式属性:ng-class-even,ng-class-odd--> <tr ng ...

  6. Hive_进阶

    回顾: hive 优点 1. 类sql语句靠近关系型数据库,可自定义函数,增加了扩展性,易于开发,减少mapreduce学习成本 2. hive转换sql语句为mapreduce程序以mapreduc ...

  7. FK JavaScript:ArcGIS JavaScript类库加载不成功而导致的程序异常

    现象:页面加载时,有时候成功,有时候出错,出错的地方为init.js 加载esri的类库 经过仔细对比,发现出错时dojo加载的类库中,对象的很多属性都为undefined,而加载成功时,该对象的相关 ...

  8. HTML静态网页 Window.document对象

    一.找到元素: docunment.getElementById("id"):根据id找,最多找一个:    var a =docunment.getElementById(&qu ...

  9. linux笔记八---------文件查找

    1.find文件查找指令 > find  目录  参数 参数值,参数 参数值.....    > find  /  -name  passwd   //从系统根目录开始递归查找name=p ...

  10. zju(8)串口通信实验

    1.实验目的 1.学习和掌握linux下串口的操作方法以及应用程序的编写: 二.实验内容 1.编写EduKit-IV实验箱Linux操作系统下串口的应用程序,运行时只需要将串口线的一端连接到开发板的c ...