紀(jì)錄和總結(jié)還真是一件難事瘾晃,一方面也是查閱了各種資料然后解決了的問題爆安,就會覺得既然有資料能解決醒串,那我還要總結(jié)和紀(jì)錄么烦却?另一方面雖然說是日記卻并不能保證時效性宠叼,寫的時候也只是重新回憶。
不過蛋蛋說其爵,想起什么寫什么冒冬,多寫寫心得什么的,以后說不定還能裝逼......
嗯摩渺,那今天就寫一寫開發(fā)時遇到的一個小問題简烤,因為整體用到的幾個大模塊,所以用了TabBarController來做切換摇幻,而設(shè)計師給我其中某個模塊的設(shè)計圖時横侦,做了幾個要求挥萌。
1.這個模塊的Item沒有選中的情況下點擊時,跳轉(zhuǎn)到對應(yīng)模塊的主頁面枉侧。
2.這個模塊的Item選中的狀態(tài)下點擊時引瀑,進(jìn)行一個頁面跳轉(zhuǎn)。
3.這個模塊的主頁面有一個按鈕榨馁,點擊時憨栽,下面的Item的圖片改變,再點擊時辆影,進(jìn)行另一個頁面跳轉(zhuǎn)徒像。
因為沒有思路,所以我撓了五分鐘頭后蛙讥,去跟設(shè)計師打了一架......
好吧锯蛀,這個是開玩笑的,我過去跟設(shè)計師進(jìn)行了友好的交流后次慢,設(shè)計師說可以給我單獨再設(shè)計一個頁面旁涤。
后來我在等待設(shè)計師出圖時,撓頭了兩分鐘迫像,覺得作為一個理科男劈愚,本著科學(xué)精神,不應(yīng)該在問題面前妥協(xié)闻妓,應(yīng)該想辦法解決問題菌羽,所以果斷開始百度谷歌,終于在設(shè)計師出圖之前由缆,解決了這個問題注祖,然后告訴他:
嗯,這圖我不要了均唉。什么是晨?剛做好?哎呀這么丑舔箭,不要了不要了罩缴,我這么機智聰明,問題早解決了层扶。
嗯箫章,開始解決問題。
1.寫一個繼承自UITabBarController的子類怒医。
2.做兩個屬性炉抒。
//紀(jì)錄上次的item
@property (nonatomic,strong) UITabBarItem *lastItem;
//是否要跳頁的狀態(tài),默認(rèn)值給NO
@property (nonatomic,assign) CGFloat itemState;
3.遵守UITabBarControllerDelegate協(xié)議稚叹,然后把自己設(shè)置為自己的代理
self.delegate = self;
4.實現(xiàn)代理中的方法焰薄,如果本次選中和上次選中的Item是一樣的拿诸,就發(fā)一個通知,這個通知只有要跳轉(zhuǎn)頁面的那個Item對應(yīng)的頁面注冊塞茅,所以只有它會進(jìn)入這個通知的方法亩码。
-(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item{
// 判斷本次點擊的UITabBarItem是否和上次的一樣
if (item == self.lastItem) { // 一樣就發(fā)出通知
self.itemState = YES;
[[NSNotificationCenter defaultCenter] postNotificationName:@"ItemDidClickNotification" object:nil userInfo:nil];
}else{
self.itemState = NO;
}
// 將這次點擊的UITabBarItem賦值給屬性
self.lastItem = item;
}
5.再實現(xiàn)一個代理中的方法,因為本來點擊Item時野瘦,TabBarController是要切換頁面的描沟,我們來實現(xiàn)代理方法,當(dāng)要跳轉(zhuǎn)頁面時鞭光,就補讓它再切換頁面了吏廉,不然你跳轉(zhuǎn)了之后,會瞬間給你切換回來惰许。
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
//是第三個根視圖且本次點擊跟上次一樣席覆,就不切換
if (viewController == self.viewControllers[2] && self.itemState) {
//點擊中間tabbarItem,不切換汹买,讓當(dāng)前頁面跳轉(zhuǎn)
return NO;
}
return YES;
}
6.在第四步中說的那個要跳轉(zhuǎn)的頁面注冊通知佩伤。
//注冊通知
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(itemAction:) name:@"ItemDidClickNotification" object:nil];
7.實現(xiàn)上一步的通知方法
#pragma mark - 通知的方法
-(void)itemAction:(NSNotification *)notification{
UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
// 判斷這個控件是否在主窗口上(即該控件和keyWindow有沒有交叉)
BOOL isOnWindow = CGRectIntersectsRect(self.view.frame, keyWindow.bounds);
// 再判斷這個控件是否真正顯示在窗口范圍內(nèi)(是否在窗口上,是否為隱藏晦毙,是否透明)
BOOL isShowingOnWindow = (self.view.window == keyWindow) && !self.view.isHidden && (self.view.alpha > 0.01) && isOnWindow;
if (isShowingOnWindow) {
if ([self.selectStr isEqualToString:@"一"]) {
//第一種頁面跳轉(zhuǎn)
OneViewController *oneVC = [[OneViewController alloc]init];
[self.navigationController pushViewController:oneVC animated:YES];
}else{
//第二種頁面跳轉(zhuǎn)
TwoViewController *twoVC = [[TwoViewController alloc]init];
[self.navigationController pushViewController:twoVC animated:YES];
}
}
}
撓頭解除生巡。