UITextView textViewShouldBegin多次点击时崩溃
我有一个UIViewController。在这个控制器中,我以编程方式创建一个UITextView并将其代理设置为我的控制器。我这样做是因为我不想在点击它时开始编辑textView。UITextView textViewShouldBegin多次点击时崩溃
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
经过一些测试后,我发现它似乎是一个iOS 5.X>错误。当在4.3设备/模拟器中运行我的应用程序时,它的工作方式应该如此。
看看我编辑日志文件的主要文章。
如果你不使用ARC,那么你应该为textView创建一个属性(retain,nonatomic),以便它在viewDidLoad方法之后不会被释放。 – calampunay 2013-05-01 16:48:08
如果你不想启动的UITextView的编辑,当你敲击它:在的dealloc
UITextView* textView = ...;
textView.editable = NO;
我也想知道它是否被点击:) – Wesley 2012-04-17 11:50:54
尝试UITapGestureRecognizer – 2012-04-17 13:36:48
-(BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
[txtView resignFirstResponder];
}
和释放txtView方法
我找到了解决方案。我不喜欢围绕苹果的错误工作,但有时候你必须这样做。这是三个步骤...
1)用一种无形的视图
- (void)viewDidLoad
{
[super viewDidLoad];
myTextView.inputView = customKeyboard;
}
2替换默认的键盘)回答是允许编辑
- (BOOL)textViewShouldBeginEditing:(UITextView *)textView{
return YES;
}
3)在textViewDidChangeSelection辞职第一响应隐藏光标
- (void)textViewDidChangeSelection:(UITextView *)textView{
[textView resignFirstResponder];
}
似乎像一个OK工作:-)。我不记得我最终做了什么来修复它。 – Wesley 2012-06-21 09:16:06
我无法更改键盘类型,因为它必须是数字键盘,而其余的步骤对我来说不起作用。 – 2013-09-28 11:22:48
remove [textView release];从你的ViewDidLoad方法,然后尝试它。 – 2012-04-17 10:18:49
不工作:) – Wesley 2012-04-17 10:21:39
在我身边它的工作很好。但我使用ARC启用。 – 2012-04-17 10:26:46