处理需要处理多个选择器的手势?

Handling a gesture that needs to address multiple selectors?

我在项目中处理一些非常令人困惑的代码,似乎使用了一个手势来触发函数,并且该函数触发了一个选择器到父视图触发了一个函数,经过一些调整后工作正常.

问题是,子类在几个不同的父视图中使用,因此使用 superview 查找选择器会导致崩溃,它在 1 次使用中存在,但在第二次使用中不存在。

我该如何处理它才能根据其父视图调用不同的选择器?当前的设置看起来很老套,显然不能正常工作……下面是一些代码:

重复使用的视图用这个手势初始化:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(bandBypassWasPressed:)];
        [tap setDelegate:self];
        [tap setCancelsTouchesInView:NO];
        [self addGestureRecognizer:tap];

正在自行调用此函数:

- (IBAction)bandBypassWasPressed:(UITapGestureRecognizer *)sender {
        if (CGRectContainsPoint(self.bounds, [sender locationInView:self])) {
            [self.superview performSelector:@selector(bandViewOn:) withObject:self];
            [self setNeedsDisplay];
        }
    }

问题是 'bandViewOn' 仅在 1 次使用此子视图时存在于超级视图中,而不存在于其他视图中,这意味着它会触发调用并使应用程序崩溃,因为那里没有具有该名称的函数.

根据它的超级视图,我希望它调用不同的函数。这是

- (void)lowBandBypass:(NSInteger)on {
        NSLog(@"lowBandBypass CALLED");
        _eqData.filter[1].bypass = on;
        _lowBand.on = on;
        [_lowBand setNeedsDisplay];
    }

我该如何处理才能解决这个奇怪的问题...

干杯并欣赏它有点复杂!

您可以使用respondsToSelector在调用之前检查父视图是否实现了该方法。

if (CGRectContainsPoint(self.bounds, [sender locationInView:self])) {
    if [self.superview respondsToSelector:@selector(bandViewOn:)] {
        [self.superview performSelector:@selector(bandViewOn:) withObject:self];
    }
    [self setNeedsDisplay];
}