Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c iOS10 UITextView触摸事件崩溃_Objective C_Uitextview_Uigesturerecognizer_Ios10_Uitapgesturerecognizer - Fatal编程技术网

Objective c iOS10 UITextView触摸事件崩溃

Objective c iOS10 UITextView触摸事件崩溃,objective-c,uitextview,uigesturerecognizer,ios10,uitapgesturerecognizer,Objective C,Uitextview,Uigesturerecognizer,Ios10,Uitapgesturerecognizer,我有一个非常奇怪的问题,UITextView触摸事件在双击时崩溃,而相同的代码在

我有一个非常奇怪的问题,UITextView触摸事件在双击时崩溃,而相同的代码在

实际上,我正在添加基于权限的双击日志按下手势。如果用户有评论权限,则在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)textViewDidBeginEditing:(UITextView *)inView
{

    [self.commentView becomeFirstResponder];
    range=[self.commentView selectedRange];    
}
单点点击

-(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];
}
双击时的

-(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委托方法

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)textViewDidBeginEditing:(UITextView *)inView
{

    [self.commentView becomeFirstResponder];
    range=[self.commentView selectedRange];    
}
用例:

当我双击选择任何单词时,应用程序崩溃且UIMenuController不会出现

但如果我添加以下行,应用程序不会崩溃

- (void)textViewDidChangeSelection:(UITextView *)textView{
    [textView resignFirstResponder];
}  // app does not crash
UIMenuController显示了注释菜单项,非常棒。我很高兴我已经解决了撞车问题

但还有一个问题,当我按outside时,菜单会隐藏并显示 再次选择任何单词,则该单词不会再次出现。


我已经尝试了所有可能的方法来显示返回菜单 是/对可以成为第一响应者。我知道,必须有一个视野 这要求菜单显示的第一响应者。但是怎么做呢?

第二次触摸时,甚至不调用任何手势识别器方法

 longPressgesture.minimumPressDuration = 0.2;
我想问题就在这里。0.2s太小,无法用于长压机。可能两者都被触发(长按和双击)


将其更改为更高的值,如1.5s。

从日志中可以清楚地看到,当识别到双击时,相同的触摸更新也会发送到另一个手势识别器,但该识别器失败。 因此,一个简单的解决方案是避免在双击时检测到其他手势。 这可以通过在
commentView
require
doubleTap
上使用
requiregestrerecognizertofail
进行所有其他手势来实现。只需在
addgesturetextview
方法中添加条件,如下所示

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
太复杂,需要简化代码。您需要简化手势管理,否则您将面临更多此类问题

用例:标题下面的所有细节都很混乱。您的问题是崩溃还是工具提示?请相应地更新您的问题并删除所有不相关的信息。@lukya。首先,双击UITextView会导致崩溃,但是如果我添加了textViewDidChangeSelection,它不会崩溃,但是工具提示不会出现,仅仅看一下你的问题就不可能解决。如果可能,提供源代码(通过github等)。@lukya ok。我想你应该添加swift标签,而不是iPad或iPhone。谢谢你的回答。我按照您的建议进行操作,崩溃没有发生,但菜单不会再次显示。当你长按时它会显示,但我想在用户双击任何文本时显示菜单。嗯,你在太多的地方添加了太多的手势。我的代码建议只解决了您提到的崩溃问题,并在第一次打开上下文菜单。对于进一步的问题,您需要大量清理代码。谢谢。但我的问题还是一样。正如我在查询中提到的,“但还有一个问题,当我按outside时,菜单会隐藏并再次选择任何单词,然后它不会再次出现。”您的代码太混乱,无法调试,无法找到上面提到的确切问题。你有太多的视觉元素没有任何清晰的布局,太多的手势被添加/删除太多次。如果你清理了你的代码,并再次上传,我可以再次查看代码。你的另一个选择是试错法。注释掉部分代码,看看问题是否仍然存在。如果是,则您注释的代码不是可疑代码。取消注释所有内容,然后重新开始代码的其他部分。e、 g.1。注释掉除双击2以外的所有手势相关代码。注释掉屏幕3上的所有其他交互UI元素。在一个简单的视图控制器上实现一个文本视图,只需双击等。这听起来非常愚蠢和不科学,但如果您不将代码重构为模块化的片段,这仍然是调试它的唯一方法。