我需要处理双点击操作,才能从使用自定义视图表示的导航路径返回。
通常,双龙头会在导航控制器的堆栈中删除嵌套的最顶层控制器。我想处理这件事,做点别的事。
在(BOOL)tabBarController:shouldSelectViewController:中放置代码是没有帮助的,因为单次和双次点击之间没有区别。
谢谢。
发布于 2014-11-14 12:29:25
我必须在tabBarController:shouldSelectViewController: implementation中添加一个tapCounter:
self.tapCounter++;
// rule out possibility when the user taps on two different tabs very fast
BOOL hasTappedTwiceOnOneTab = NO;
if(self.previousHandledViewController == viewController) {
    hasTappedTwiceOnOneTab = YES;
}
self.previousHandledViewController = viewController;
// this code is called in the case when the user tapped twice faster then tapTimeRange
CGFloat tapTimeRange = 0.3;
        if(self.tapCounter == 2 && hasTappedTwiceOnOneTab) {
            // do something when tapped twice 
            self.tapCounter = 0;
            return NO; // or YES when you want the default engine process the event
        } else if(self.tapCounter == 1) {
            __block BOOL isSameViewControllerSelected = self.selectedViewController == viewController;
            if(isSameViewControllerSelected) {
                // do something when tapped once
            }
            dispatch_after_delay_on_main_queue(tapTimeRange, ^{
                self.tapCounter = 0; // reset the counter in case there is a single tap followed with another one, but with longer time then tapTimeRange
            });
            return NO; // or YES when you want the default engine process the event 
        }这在没有任何私有api调用的情况下工作得很好。但我想知道是否有一个更好和不那么复杂的方法。
发布于 2016-01-11 03:26:21
我在斯威夫特2中改写了弗拉季米尔斯洛伐克语的答案,以防有人需要它
var tapCounter : Int = 0
var previousVC = UIViewController()
func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool {
    self.tapCounter++
    let hasTappedTwice = self.previousVC == viewController
    self.previousVC = viewController
    if self.tapCounter == 2 && hasTappedTwice {
        self.tapCounter = 0
        print ("Double Tapped!")
    }
    if self.tapCounter == 1 {
        let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(0.3 * Double(NSEC_PER_SEC)))
        dispatch_after(delayTime, dispatch_get_main_queue(), {
            self.tapCounter = 0
        })
    }
    return true
}发布于 2015-08-23 04:42:38
试试这个:
@property (nonatomic, assign) NSTimeInterval tapTime;
@property (nonatomic, weak) UIViewController *prevVC;
- viewDidLoad {
    self.tabBarController.delegate = self;
}
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
    NSTimeInterval currentTime = [[NSDate date] timeIntervalSince1970];
    NSTimeInterval duration = currentTime - self.tapTime;
    self.tapTime = currentTime;
    if (viewController == self.prevVC) {
        if (duration < 0.35) {
            // double tap detected! write your code here
            self.tapTime = 0;
        }
    }
    self.prevVC = viewController; 
}https://stackoverflow.com/questions/26913823
复制相似问题