UITextView textViewShouldBeginEditing在多次点击时崩溃

时间:2012-04-17 10:12:14

标签: iphone objective-c ios xcode uitextview

我有一个UIViewController。在这个控制器中,我以编程方式创建一个UITextView并将其委托设置为我的控制器。我这样做是因为我不想在点击它时开始编辑textView。

ViewDidLoad方法

UITextView* textView = [[UITextView alloc] initWithFrame:CGRectMake(9, 10, 302, 200)];
[textView setDelegate:self];
[self.view addSubview:textView];
[textView release];

我实现了textViewShouldBeginEditing方法,在此处返回NO以禁止键盘显示。

textViewShouldBeginEditing方法

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
    NSLog(@"Shouldbegin");
    return NO;
}

出现的问题

当我点击textView时它会工作一次,但是如果我再次点击它会导致应用程序崩溃而没有任何日志。当我持有textView并释放它时,它会像我希望它一样工作。另一方面,正常的单击不会再次工作。

修改

在对方之后快速单击也似乎有效,所以看起来我等了x秒后才能工作。

经过一些测试后我发现它似乎是iOS 5.X>错误。在4.3设备/模拟器中运行我的应用程序时,它的工作方式应该如此。 iOS 5.1设备上的错误日志说明如下:

Date/Time:       2012-04-17 14:00:49.497 +0200
OS Version:      iPhone OS 5.1 (9B176)
Report Version:  104

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000014
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   TextInput                       0x36bf69e8 TI::Favonius::BeamSearch::choose_hit_test_node(WTF::RefPtr<TI::Favonius::SearchNode> const&, WTF::RefPtr<TI::Favonius::KeyAreaNode> const&, WTF::RefPtr<TI::Favonius::SearchNode> const&, WTF::RefPtr<TI::Favonius::SearchNode> const&) + 12
1   TextInput                       0x36bf6d1e TI::Favonius::BeamSearch::update_for_touch(unsigned int, WTF::PassRefPtr<TI::Favonius::KeyAreaNode>) + 602
2   TextInput                       0x36bfb5c2 TI::Favonius::StrokeBuildManager::update_search_for_touch(unsigned int, int) + 66
3   TextInput                       0x36bfb97c TI::Favonius::StrokeBuildManager::key_down_or_drag_hit_test_for_UI(bool, CGPoint, double, int, int, float, bool, ZT::LayoutDictionaryContext&, bool, int) + 216
4   TextInput                       0x36bddf54 TIInputManagerZephyr::simulate_touches_for_input_string() + 344
5   TextInput                       0x36bed8ba -[TIKeyboardInputManagerZephyr candidates] + 214
6   UIKit                           0x31066616 -[UIKeyboardImpl generateAutocorrectionReplacements:] + 82
7   UIKit                           0x31108a96 __71-[UITextInteractionAssistant scheduleReplacementsForRange:withOptions:]_block_invoke_0 + 370
8   UIKit                           0x3110ec62 -[UITextSelectionView calculateAndShowReplacements:] + 6
9   Foundation                      0x3762192c __NSFireDelayedPerform + 408
10  CoreFoundation                  0x361a1a2c __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 8
11  CoreFoundation                  0x361a1692 __CFRunLoopDoTimer + 358
12  CoreFoundation                  0x361a0268 __CFRunLoopRun + 1200
13  CoreFoundation                  0x3612349e CFRunLoopRunSpecific + 294
14  CoreFoundation                  0x36123366 CFRunLoopRunInMode + 98
15  GraphicsServices                0x324e3432 GSEventRunModal + 130
16  UIKit                           0x30e70e76 UIApplicationMain + 1074

5 个答案:

答案 0 :(得分:1)

我确实找到了解决方案。我真的不喜欢解决Apple漏洞,但有时你必须这样做。这是三个步骤......

1)用不可见的视图替换默认键盘

- (void)viewDidLoad
{
    [super viewDidLoad];
    myTextView.inputView = customKeyboard;
}

2)回答“是”以允许编辑

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView{
    return YES;
}

3)在textViewDidChangeSelection中重新签名第一个响应者以隐藏光标

- (void)textViewDidChangeSelection:(UITextView *)textView{
    [textView resignFirstResponder];
}

答案 1 :(得分:0)

如果您在点击它时不想开始编辑UITextView:

UITextView* textView = ...;
textView.editable = NO;

答案 2 :(得分:0)

-(BOOL)textViewShouldBeginEditing:(UITextView *)textView
{

   [txtView resignFirstResponder];

}

并在dealloc方法中发布txtView

答案 3 :(得分:0)

经过一些测试后我发现它似乎是iOS 5.X&gt;错误。在4.3设备/模拟器中运行我的应用程序时,它的工作方式应该如此。

查看我编辑日志文件的主帖。

答案 4 :(得分:0)

Swift 4.2 解决此问题的最佳简便方法就是使撤消管理器为假

textView.undoManager?.disableUndoRegistration()

如果您在运行时(如在表中)更改了视图,则会出现此错误,并且在点击时将重新加载单元格,