20

我有一个UIButton从 xib 文件加载的作为IBOutlet视图控制器的属性。viewDidLoad我在视图控制器的按钮上附加了一个选择器:

[_myButton addTarget:self action:@selector(mySelector) forControlEvents:UIControlEventTouchUpInside];

在 iOS 6 中一切正常,但是当我在 iOS 5.0 的模拟器上运行时,不会调用选择器。该按钮在被触摸时会突出显示。

另一件需要注意的事情是,该按钮位于添加了一个的UIViewa 中UITapGestureRecognizer。当UITapGestureRecognizer点击按钮时,在 iOS 5.0 中会调用 for 此视图(在 iOS 6 中不会调用它,而是调用按钮的选择器)。

我没有运行 iOS 5 的设备,所以我没有在设备上进行测试,只是模拟器。

有谁知道这里发生了什么,以及如何解决?

4

2 回答 2

24

您已经很好地解释了问题的原因。在 iOS 5 上,按钮超级视图上的 UITapGestureRecognizer 会干扰按钮的操作。在 iOS 6 上,他们解决了这个问题:他们引入了一个 UIView 事件gestureRecognizerShouldBegin:,并且一个按钮会自动为附加到超级视图的点击手势识别器返回 NO。

对于 iOS 5,您需要在点击手势识别器上使用委托方法来阻止它识别点击的视图是否是按钮。

于 2013-01-16T17:40:29.170 回答
0

在我的例子中,当用户点击主视图上的任意位置时,我还使用通用UITapGestureRecognizer来关闭由文本字段打开的键盘。

我通过仅在键盘出现时添加手势识别器来解决此问题(请参阅

- (void)keyboardWillShow:(NSNotification *)n或者

- (BOOL)textFieldShouldBeginEditing:(VDTextFieldWithError *)textField)

然后在隐藏键盘时移除手势识别器(从而移除识别器本身的选择器方法中的选择器)

于 2013-03-01T13:47:25.473 回答