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

标签 ios objective-c selector

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

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

我该如何处理这个问题,以便它根据其父 View 调用不同的选择器?当前的设置看起来很老套,显然不能正常工作,因为它需要...下面的一些代码:

重用 View 通过此手势初始化:

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”仅存在于该 subview 的一次使用中的 super View 中,而不存在于另一个中,这意味着它会触发调用并使应用程序崩溃,因为那里没有具有该名称的函数。

我希望它根据其 super View 调用不同的函数。这是

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

我该如何处理这个奇怪的问题......

干杯并欣赏它有点复杂!

最佳答案

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

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

关于ios - 处理需要处理多个选择器的手势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43918623/

相关文章:

objective-c - 相对于设备和方向的框架大小

javascript - 过滤 jQuery 选择的返回数组的最快方法

ios - Itunes非公开API用法:如何查找选择器?

css - 嵌套的 CSS 样式?

ios - 在 iOS 上使用声音字体导出 midi

iphone - UITableview 部分标题不显示文本

ios - Objective-C/CocoaHTTPServer - 是否可以将响应返回到应用程序?

android - Flutter - 拍照

ios - 将新委托(delegate)添加到新 Controller 的问题

objective-c - UIImage imageNamed 不显示带有 xcode 4.4 的图像