我在我的应用中遇到了一个错误,该错误导致我之前通过UITextField
添加到addGestureRecognizer:
的手势停止工作。基本上,我将tap
和long press
手势识别器添加到UITextField
(已经从iOS应用了7个手势识别器)。记录self.textField.gestureRecognizers
时,它会显示现有的7个手势,然后是我在阵列末尾添加的两个手势。手势就像我预期的那样工作。
然而,当我呈现模态视图控制器然后将其关闭时,我的两个手势停止在文本字段上工作。我不确定为什么,但视图确实消失了,并且resignsFirstResponder
(键盘在显示模态VC时始终处于启动状态)可能是相关的。但是我发现手势没有从文本字段中删除,但是数组中手势的顺序已经改变。我的自定义手势现在位于索引0和1而不是7和8.我相信7个默认手势是冲突/覆盖我的自定义手势(我假设稍后在阵列中的位置覆盖之前的那些)这解释了为什么他们甚至停止工作虽然他们仍然适用。
我的问题是:
- 你知道为什么要重新排序self.textField.gestureRecognizers
中的元素吗?
- 如何防止这种情况发生,以确保我的自定义手势始终有效,而不会违反UITextField
的默认手势?
我目前的解决方案是首次添加两个手势,然后存储总共(9)手势的数组,然后在viewDidAppear
我更改gestureRecognizers
数组(是的,它是可设置的)我存储的数组。这保证了数组将是7个内置手势,然后是我的两个自定义手势。但我发现我的手势覆盖了默认手势(弹出切换,复制等弹出窗口),所以我必须在我的自定义手势发生后将手势重置为默认值7(这很好 - 我只需要在识别我的自定义手势后一次触发动作)。足够简单 - 我也将原始手势存储在属性中。但这并不是最好的解决方案。我更愿意找出原因,并以不同的方式解决或解决问题,而不是将代码绑在一起。
答案 0 :(得分:0)
当视图控制器的视图首次出现时,会调用我的第一个解决方案是始终在viewDidAppear
中添加我的两个手势
viewDidAppear:
,但稍后在显示的视图控制器被解除时也会再次调用它。
因此,您要添加两次手势识别器。
最简单的解决方案是使用BOOL实例变量(我们将其称为" flag"),您将第一个时间设置为YES并在之后进行测试:
if (!self.addedGestures) {
self.addedGestures = YES;
// ... add them! ...
}
现在你只会添加一次。
(另一方面,可能有人认为,如果你关心数组中手势识别器的顺序,你已经做错了。使用委托方法来解决手势识别器之间的冲突 - 这就是他们的意思是为了。)