一.點(diǎn)擊更多按鈕
1.項(xiàng)目需求
點(diǎn)擊更多按鈕,從底部彈出一個(gè)框
2.怎么從底部彈出一個(gè)框?
兩種方法:
一種用 UIActionSheet
另一種用 UIAlertController
2.1 使用UIActionSheet
好處: 不需要控制器,直接就能使用
缺點(diǎn): 方法過期了,監(jiān)聽按鈕的點(diǎn)擊比較麻煩
源代碼:
// 以后只要發(fā)現(xiàn)有可變參數(shù),最后一定要添加nil
UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"收藏",@"舉報(bào)",nil];
[sheet showInView:self];
2.2 使用UIAlertController
好處:能方法監(jiān)聽按鈕的點(diǎn)擊
缺點(diǎn):代碼要寫很多,依賴控制器(需要控制器modal出來)
2.3 使用UIAlertController需要使用通知,通知最近的控制器把UIAlertController modal出來
注意:使用通知,當(dāng)控制器銷毀的時(shí)候,一定要移除通知
2.4 為什么使用通知,不使用代理?
通知可以跨級(jí)傳遞消息
代理,一般是上下級(jí)來傳遞消息
3.怎么能快速拿到一個(gè)控制器?
全局有一個(gè)單例 UIApplication,通過這個(gè)單例我們能拿到窗口的跟控制器
// 以后只要想快速拿控制器,拿窗口根控制器
[UIApplication sharedApplication].keyWindow.rootViewController;
二.發(fā)布帖子的時(shí)間處理
1.時(shí)間處理的業(yè)務(wù)邏輯分析
1.1先判斷是否是今年的帖子,如果不是今年,就顯示 2015-08-06 21:10:08 這種格式
1.2如果是今年,在判斷是否是今天,如果是今天 在判斷有沒有超過一個(gè)小時(shí),超過一個(gè)小時(shí) 就顯示 多少小時(shí)前 這種格式
1.3如果不超過一小時(shí),判斷有沒有超過2分鐘 超過兩分鐘 就顯示 多少分鐘前 這種格式
1.4 如果不超過兩分鐘,就顯示 剛剛 這種格式
1.5 如果時(shí)間超過一天,在判斷有沒有超過一天 如果沒有 就顯示 昨天 21:10這種格式
1.6 如果時(shí)間超過一天 就顯示 08-05 21:10:08這種格式
2.由于業(yè)務(wù)邏輯非常深,寫代碼的時(shí)候,容易搞混,怎么處理?
我們可以采取先寫偽代碼,理清思路,再轉(zhuǎn)換為真實(shí)代碼
什么是偽代碼:偽代碼就是中文和代碼的結(jié)合寫出來的代碼
偽代碼示例
// 處理時(shí)間(用帖子發(fā)布時(shí)間與當(dāng)前時(shí)間比較)
if (今年) {
if (今天) {
if (大于1小時(shí)) {
} else if (大于2分鐘) {
} else { // 剛剛
}
} else if (昨天) {
} else { // 昨天之前
}
} else{ // 非今年
}
3.怎么獲取時(shí)間差值?
3.1 先把字符串對(duì)象的日期轉(zhuǎn)換成 日期對(duì)象的日期格式
3.1.1 獲取 NSDateFormatter對(duì)象,用來 NSStreing與NSDate互轉(zhuǎn)
3.1.2 設(shè)置日期格式(轉(zhuǎn)換成什么格式的日期)
3.1.3 把字符串日期, 轉(zhuǎn)換成特定格式的日期
4.判斷是否是今年
4.1 怎么判斷?
判斷年份是否相同
4.2 怎么獲取日期年份,或月份,等等?
可以通過日歷類來拿到日期組件,就可以獲得年,月日和時(shí)分秒了
處理日期格式原碼
// 1.把帖子發(fā)布時(shí)間字符串轉(zhuǎn)換成(NSDate)日期對(duì)象 => NSDateFormatter
// NSDateFormatter:NSStreing與NSDate互轉(zhuǎn)
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
// 設(shè)置格式
fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
// 發(fā)布日期對(duì)象
NSDate *createDate = [fmt dateFromString:item.create_time];
// 獲取日歷類對(duì)象
// 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 >= 1) {
timeStr = [NSString stringWithFormat:@"%ld小時(shí)前",cmp.hour];
} else if (cmp.minute >= 2) {
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];
}
}
因?yàn)榕袛嗳掌谝S?我們就把判斷方法抽取到NSDate的分類
- (BOOL)isThisYear
{
// 獲取當(dāng)前日期對(duì)象
NSDate *curDate = [NSDate date];
// 獲取日歷類
NSCalendar *curCalendar = [NSCalendar currentCalendar];
// 獲取自己日期組件(年,月,等) self代碼外面調(diào)用這個(gè)方法的日歷類(也就是createDate)
NSDateComponents *selfCmp = [curCalendar components:NSCalendarUnitYear fromDate:self];
// 獲取當(dāng)前時(shí)間日期組件(年,月,等)
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];
}