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.由于业务逻辑非常深,写代码的时候,容易搞混,怎么处理? 我们可以采取先写伪代码,理清思路,再转换为真实代码 什么是伪代码:伪代码就是中文和代码的结合写出来的代码 伪代码实例 // 处理时间(用帖子发布时间与当前时间比较)
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 }