ios中UITabBarController单击(双击)处理事件

时间:2022-09-28 19:27:26

如题,像qq,当我们单击下方的消息时,扣扣会帮我们自动滑动到未读消息上面,当然也有一些是双击滑动,还有一些是双击下方的TabBaitem完成下拉刷新。由于公司项目需要,就稍微研究了下这个功能。网上说的什么都有,干脆自己写算了,有不好的地方还请指出来。

首先我们创建一个demo,架构为一个UITabBarController加两个已经设置rootviewcontroller的UINavigationController来演示。这个就不上图了 比较简单。

接下来我们就利用UITabBarDelegate的代理方法实现,由于我们是用的系统自带的UITabBarController,所以当然也有UITabBarControllerDelegate一样可以使用。不多说直接上代码

#import "OneTableViewController.h"
@interface OneTableViewController ()<UITabBarControllerDelegate>

@end

@implementation OneTableViewController

- (void)viewDidLoad {
[super viewDidLoad];
self.tabBarController.delegate=self;
self.navigationItem.title=@"消息";
}

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{
//单击处理
int i=0;
UINavigationController *navdid=tabBarController.selectedViewController;//当前状态下已经处于选择状态的vc
UINavigationController *nav=(UINavigationController*)viewController;//点击的vc
if (![navdid.topViewController isEqual:self]) {//这里是判断nav的rootviewcontroller,但是这一层时它里面只有onetableviewcontroller这一个控制器,所以我们可以判断topViewController就是它了,这个属性是取栈定控制器。
i--;//如果是从别的页面切换过来则不用立马做未读消息处理,让i的值随意变动一下,不等于1就行了
}

if ([nav.topViewController isEqual:self]) {
i++;
NSLog(@"点击了消息页面,i的值为%d",i);

}
if (i==1) {
//这里做未读消息滚动处理或者刷新功能处理,如果这个页面里面有分了两个小页面,可以使用block和delegate,当然我建议使用block,比代理模式简单又好用。



}

return YES;//这里做一下解释,该方法用于控制TabBarItem能不能选中,返回NO,将禁止用户点击某一个TabBarItem被选中。



}

#import "OneTableViewController.h"

@interface OneTableViewController ()<UITabBarControllerDelegate>
@property(nonatomic,assign)int i;
@end

@implementation OneTableViewController

-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.i=0;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.tabBarController.delegate=self;
self.navigationItem.title=@"消息";
}
//双击处理,这里双击是指的点击两次,当然可以不连续。如果非要做到那种连续快速点击两次,我们还要做一个点击间隔的时间判断,这个少尉麻烦一点就不去试了,原谅我的懒惰.有兴趣的同学可以用时间戳来实现,用一个全局变量记录第一次点击时间,然后和第二次点击时间对比,如果间隔在自己设置的连续点击时间内(比如我们认为两次点击时间间隔在1秒内认为就是双击),就判断为双击,否则就认为单击,让第二次点击时间在赋给那个全局变量接着做判断,当然这里还有一些比如三连击等,要注意在判断双击之后再做一次判断以防三连击当成两次双击做处理了就行了。
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{

//双击处理
UINavigationController *navdid=tabBarController.selectedViewController;
UINavigationController *nav=(UINavigationController*)viewController;
if (![navdid.topViewController isEqual:self]) {
self.i--;
}

if ([nav.topViewController isEqual:self]) {
self.i++;
}
if (self.i==2) {
self.i=0;
NSLog(@"点击两次");
//这里做逻辑处理就行了
}
return YES;

}

以上全凭自己想的方法实现,如果有更好的方法,欢迎分享指正。