处理需要处理多个选择器的手势?
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];
}
我在项目中处理一些非常令人困惑的代码,似乎使用了一个手势来触发函数,并且该函数触发了一个选择器到父视图触发了一个函数,经过一些调整后工作正常.
问题是,子类在几个不同的父视图中使用,因此使用 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];
}