iOS開發之TabBar再次點選實現重新整理

yungfan發表於2018-03-27

需求

之前已經實現了自定義TabBar,如圖所示:

img_e18f5799c484b170df40f54e3de01f1a.jpe
自定義TabBar.jpeg

現在需要實現一個類似今日頭條TabBar的功能 —— 如果繼續點選當前TabBar的選中項,那麼該介面需要重新整理UITableView。

分析

既然已經自定義了TabBar,那麼最簡單的就是在自定義中給TabBar中需要的UITabBarButton新增事件 —— 點選就傳送通知,並且將當前的索引傳出去。對應的介面監聽通知,拿到索引比對,如果和當前索引一致,就執行對應的操作。

實現

  1. 自定義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];
            
        }
    }
}
  1. 監聽事件,傳送通知
- (void)tabBarButtonClick:(UIControl *)tabBarBtn{
    
    //判斷當前按鈕是否為上一個按鈕
    //再次點選同一個item時傳送通知出去 對應的VC捕獲並判斷
    if (self.previousClickedTag == tabBarBtn.tag) {
        
        [[NSNotificationCenter defaultCenter] postNotificationName:
         @"DoubleClickTabbarItemNotification" object:@(tabBarBtn.tag)];
    }
    self.previousClickedTag = tabBarBtn.tag;
}
  1. 對應的UIViewController監聽通知
- (void)viewDidLoad {
    [super viewDidLoad];
    
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(doubleClickTab:) name:@"DoubleClickTabbarItemNotification" object:nil];
    
}
  1. 監聽到通知,比對後執行操作
-(void)doubleClickTab:(NSNotification *)notification{
    
    //這裡有個坑 就是直接用NSInteger接收會有問題 數字不對
    //因為上個介面傳過來的時候封裝成了物件,所以用NSNumber接收後再取值
    NSNumber *index = notification.object;
    
    if ([index intValue] == 1) {
        //重新整理
    }
    
}

2018.4.28 補充

本文被轉載後,有很多好心的讀者進行批評指正:這種方式不夠優雅,不夠簡單。怎麼最簡單呢?其實只要重寫UITabBarController的代理就可以實現,方法如下

//這個是UITabBarController的代理方法
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{
    
    // 判斷哪個介面要需要再次點選重新整理,這裡以第一個VC為例
    if ([tabBarController.selectedViewController isEqual:[tabBarController.viewControllers firstObject]]) {
        // 判斷再次選中的是否為當前的控制器
        if ([viewController isEqual:tabBarController.selectedViewController]) {
            // 執行操作
            NSLog(@"重新整理介面");
         
            return NO;
        }
        
    }
    
    return YES;

}


相關文章