一.點擊更多按鈕 1.項目需求 點擊更多按鈕,從底部彈出一個框 2.怎麼從底部彈出一個框? 兩種方法: 一種用 UIActionSheet 另一種用 UIAlertController 2.1 使用UIActionSheet 好處: 不需要控制器,直接就能使用 缺點: 方法過期了,監聽按鈕的點擊比較 ...
一.點擊更多按鈕 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 }