需求
之前已經實現了自定義TabBar,如圖所示:
現在需要實現一個類似今日頭條TabBar的功能 —— 如果繼續點選當前TabBar的選中項,那麼該介面需要重新整理UITableView。
分析
既然已經自定義了TabBar,那麼最簡單的就是在自定義中給TabBar中需要的UITabBarButton
新增事件 —— 點選就傳送通知,並且將當前的索引傳出去。對應的介面監聽通知,拿到索引比對,如果和當前索引一致,就執行對應的操作。
實現
- 自定義TabBar的layoutSubviews中繫結事件
- (void)layoutSubviews
{
[super layoutSubviews];
for (UIButton * tabBarButton in self.subviews) {
if ([tabBarButton isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
//監聽tabbar的點選
//繫結tag 標識
tabBarButton.tag = index;
//監聽tabbar的點選
[tabBarButton addTarget:self action:@selector(tabBarButtonClick:) forControlEvents:UIControlEventTouchUpInside];
}
}
}
複製程式碼
- 監聽事件,傳送通知
- (void)tabBarButtonClick:(UIControl *)tabBarBtn{
//判斷當前按鈕是否為上一個按鈕
//再次點選同一個item時傳送通知出去 對應的VC捕獲並判斷
if (self.previousClickedTag == tabBarBtn.tag) {
[[NSNotificationCenter defaultCenter] postNotificationName:
@"DoubleClickTabbarItemNotification" object:@(tabBarBtn.tag)];
}
self.previousClickedTag = tabBarBtn.tag;
}
複製程式碼
- 對應的UIViewController監聽通知
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(doubleClickTab:) name:@"DoubleClickTabbarItemNotification" object:nil];
}
複製程式碼
- 監聽到通知,比對後執行操作
-(void)doubleClickTab:(NSNotification *)notification{
//這裡有個坑 就是直接用NSInteger接收會有問題 數字不對
//因為上個介面傳過來的時候封裝成了物件,所以用NSNumber接收後再取值
NSNumber *index = notification.object;
if ([index intValue] == 1) {
//重新整理
}
}
複製程式碼