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 触摸事件崩溃的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 UItextView 顶部的子视图没有被触摸?

iOS 7 UITextView 的原生链接不会取消触摸

iphone UITextView 手动注册触摸

将光标放在用户触摸的 UITextView 上

iOS事件(触摸,移动,晃动)

使用 IOS9 时,无法在 UITable 的部分标题上的 UIButtons 上触发触摸事件(IOS10 很好)