iOS10 UITextView 触摸事件崩溃
Posted
技术标签:
【中文标题】iOS10 UITextView 触摸事件崩溃【英文标题】:iOS10 UITextView touch event crash 【发布时间】:2016-11-26 21:51:11 【问题描述】:我有一个非常奇怪的问题,UITextView 触摸事件在双击时崩溃,而相同的代码适用于
其实,我是根据权限添加双击和log press手势。如果用户有权发表评论,则在 viewDidLoad 方法中添加手势。 只能通过双击或长按来发表评论
singleTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureAction:)];
singleTapGesture.numberOfTapsRequired = 1;
// adding gesture to open window for commenting only when he has writing access
if (canComment)
longPressgesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressGestureAction:)];
longPressgesture.minimumPressDuration = 0.2;
doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doDoubleTap:)];
doubleTap.numberOfTapsRequired = 2;
点击一下
-(void)singleTapGestureAction:(UITapGestureRecognizer*)tapGestureRecognizer
if (isSingleTapped)
isSingleTapped = NO;
return;
isSingleTapped = YES;
UITextView *textView = (UITextView *)tapGestureRecognizer.view;
[self.commentView becomeFirstResponder]; // becomeFirstResponder
双击
-(void)doDoubleTap:(UITapGestureRecognizer*)tapGestureRecognizer
UITextView *textView = (UITextView *)tapGestureRecognizer.view;
[self.commentView becomeFirstResponder]; // becomeFirstResponder
// To show the UIMenuController menu
[self setCommentMenuToolTipWithRect:completeRect];
注意:我正在添加 [self.commentView becomeFirstResponder];在每个手势动作上
UITextView 委托方法
- (void)textViewDidBeginEditing:(UITextView *)inView
[self.commentView becomeFirstResponder];
range=[self.commentView selectedRange];
用例:
当我双击选择任何单词时,APP CRASH 和 UIMenuController 不会出现,
但如果我添加以下行 app 不会崩溃
- (void)textViewDidChangeSelection:(UITextView *)textView
[textView resignFirstResponder];
// app does not crash
并且 UIMenuController 出现了很棒的评论菜单项。我很高兴解决了崩溃问题。
但是还有一个问题,当我在外面按的时候,菜单隐藏了 再次选择任何单词然后它不会出现第二次。
我已经尝试了所有可能的方式来显示退货菜单 YES/TRUE to canBecomeFirstResponder。我知道,必须有一个观点 声称要显示菜单的 firstResponder 。但是如何?
第二次触摸时,甚至没有调用任何手势识别方法
【问题讨论】:
USE CASE: 标题下的所有细节都令人困惑。您的问题是崩溃还是工具提示?请相应地更新您的问题并删除所有不相关的信息。 @lukya。首先,它在 UITextView 上双击崩溃,但是如果我添加 textViewDidChangeSelection 然后它不会崩溃,但工具提示不会出现 只看你的问题是不可能解决的。如果可能,请提供源代码(通过 github 等)。 @lukya 好的。我会 你应该添加 swift 标签而不是 iPad 或 iPhone。 【参考方案1】:从日志中可以清楚地看出,当双击被识别时,相同的触摸更新也会发送到另一个手势识别器,但失败了。
因此,一个简单的解决方案是避免在双击时检测到其他手势。
这可以通过使用requireGestureRecognizerToFail
使commentView
上的所有其他手势要求doubleTap
失败来简单地实现。只需在addGestureToTextView
方法中添加条件,如下所示。
if (withDoubleTap && self.canScreenPlayEdit)
[self.commentView removeGestureRecognizer:singleTapGesture];
[self.commentView addGestureRecognizer:doubleTap];
[self.commentView addGestureRecognizer:longPressgesture];
for (UIGestureRecognizer *recognizer in self.commentView.gestureRecognizers)
[recognizer requireGestureRecognizerToFail:doubleTap];
这确实解决了崩溃问题,并且无需在textViewDidChangeSelection
中调用resignFirstResponder
即可显示菜单。
但是,您的代码中似乎存在许多问题。 PLSceneDetailsVC
太复杂了,需要简化代码。您需要简化手势管理,否则您最终将面临更多此类问题。
【讨论】:
感谢您的回答。我按照您的建议进行操作,崩溃没有发生,但菜单没有第二次显示。它会在您长按时显示,但我想在用户双击任何文本时显示菜单。 嗯,你在太多地方添加了太多手势。我的代码建议只解决了您提到的崩溃并第一次打开上下文菜单。对于进一步的问题,您需要大量清理代码。 谢谢。但我的问题仍然是一样的。正如我在查询中提到的“但是还有另一个问题,当我按下外部时,菜单隐藏并再次选择任何单词然后它不会出现第二次。” 您的代码太杂乱,无法调试,无法找到您在上面提到的确切问题。你有太多的视觉元素没有任何清晰的布局和太多的手势被添加/删除太多次。如果您大量清理代码并再次上传,我可以再次查看代码。 另一种选择是反复试验方法。注释掉部分代码,看看问题仍然存在。如果是,则您评论的代码不是嫌疑人。取消注释所有内容并从代码的其他部分重新开始。例如1. 注释掉除双击之外的所有手势相关代码 2. 注释掉屏幕上的所有其他交互式 UI 元素 3. 在简单的视图控制器上实现单个文本视图,只需双击等。这听起来非常愚蠢和不科学但是,如果您不将代码重构为模块化部分,这仍然是调试它的唯一方法。【参考方案2】: longPressgesture.minimumPressDuration = 0.2;
我猜问题出在这里。 0.2s 太小,无法用于 longPress。可能两者都被触发(长按和双击)。
将其更改为更高,例如 1.5 秒。
【讨论】:
以上是关于iOS10 UITextView 触摸事件崩溃的主要内容,如果未能解决你的问题,请参考以下文章