Objective c iOS10 UITextView触摸事件崩溃
我有一个非常奇怪的问题,UITextView触摸事件在双击时崩溃,而相同的代码在Objective c iOS10 UITextView触摸事件崩溃,objective-c,uitextview,uigesturerecognizer,ios10,uitapgesturerecognizer,Objective C,Uitextview,Uigesturerecognizer,Ios10,Uitapgesturerecognizer,我有一个非常奇怪的问题,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];
}
单点点击
-(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
requiredoubleTap
上使用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元素。在一个简单的视图控制器上实现一个文本视图,只需双击等。这听起来非常愚蠢和不科学,但如果您不将代码重构为模块化的片段,这仍然是调试它的唯一方法。