一.点击更多按钮
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. FLEX监视浏览器关闭事件

    在最近开发的一个FLEX项目中对于浏览器关闭时,需要做一些清理工作,该清理工作在正常情况下保证能运行就行了,要求不是太高. 因此在网上找了一些方法,经过实际测试确实可行,记录下来备查. 该方法可以完全 ...

  2. linux系统中errno与error对照表

    1.使用了一个小程序输出所有的errno对应的error字符串,代码如下 #include <errno.h> void showError(int err){ printf(" ...

  3. 对GitHub的认识

    Github创建于2008年被市场研究公司Forrester称作开发者的Facebook .作为开源代码库以及版本控制系统,Github拥有140多万开发者用户.随着越来越多的应用程序转移到了云上,G ...

  4. Linux文件/目录权限设置命令:chmod

    文件/目录权限设置命令:chmod 这是Linux系统管理员最常用到的命令之一,它用于改变文件或目录的访问权限.该命令有两种用法: 用包含字母和操作符表达式的文字设定法 其语法格式为:chmod [w ...

  5. nginx资源定向 css js路径问题

    今天玩玩项目,学学nginx发现还不错,速度还可以,但是CSS JS确无法使用,原来Iginx配置时需要对不同类型的文件配置规则,真是很郁闷,不过想想也还是很有道理.闲暇之际,把配置贴上来.#user ...

  6. Android基于XMPP的即时通讯3-表情发送

    这篇博文主要讲表情发送的一些东西. 参考:Android基于XMPP的即时通讯1-基本对话 1.准备好资源文件 采用的是emoji的表情,我打包好了,下载地址:http://files.cnblogs ...

  7. JAVA递归算法

    1.什么是递归算法 递归算法就是直接或间接调用自己的算法 2.问题1:一列数的规则如下: 1.1.2.3.5.8.13.21.34 ,求第30位数是多少?使用递归实现 public class Fib ...

  8. SQL Server如何添加登录名

    1.电脑上如果安装有SQL Server,我们在开始里面打开SQL Server Management Studio,或者以桌面的快捷方式等打开SQL Server. 2.首先以Windows身份验证 ...

  9. 需要注意学习.net过程的要点

    基础部分 C# 基础语法 OOP的概念,面向对象的理解 继承 封装 多态 ASP.NET MVC (Web Form 用的越来越少,如果你不熟悉,可以不看) JavaScript 基础语法 如何在HT ...

  10. 通过Queue的构造函数的可选参数maxsize来设定队列长度

    创建一个"队列"对象 import Queuemyqueue = Queue.Queue(maxsize = 10) Queue.Queue类即是一个队列的同步实现.队列长度可为无 ...