我是用UITextView以编程方式替换UITextField,但这似乎打破了Apple代码中的某些内容。
执行交换的类是两者的委托。 FIELD上的所有委托方法都正常工作 - 我使用“didBeginEditing”来触发来自FIELD的交换 - > VIEW。
还可以正确调用VIEW上的didBeginEditing / shouldBeginEditing方法。
但是... VIEW委托上的shouldEndEditing / didEndEditing方法是从不调用。无论我如何移除焦点,它们都不会被调用(我将它们打破,也可以使用日志语句)。例如没有以下工作:
调用应该/确实开始方法的事实表明委托已经分配好了,并且运行正常 - 但是为什么/如何忽略应该/做的结束方法?就好像Apple的代码中存在检测这些方法存在的错误。
注意:我使用Xcode自动完成/内容辅助来创建方法,因此我确信没有错别字。只是要明确:
-(BOOL)textViewShouldEndEditing:(UITextView *)textView
{
textComments.text = textView.text;
[textView.superview insertSubview:self.textComments aboveSubview:textView];
[textView removeFromSuperview];
return TRUE;
}
-(void)textViewDidEndEditing:(UITextView *)textView
{
textComments.text = textView.text;
[textView.superview insertSubview:self.textComments aboveSubview:textView];
[textView removeFromSuperview];
}
-(BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
NSLog(@"blah" );
return TRUE;
}
-(void)textViewDidBeginEditing:(UITextView *)textView
{
NSLog(@"blah" );
}
答案 0 :(得分:2)
我今天遇到了同样的问题。它只发生在我的iPad上,而不是模拟器中。它并不总是出现在iPad上,而是大多数。 我通过“重新配置”代理来修复它......听起来像是无关的,因为它是在委托方法本身中分配的,但它适用于我。
-(void)textViewDidBeginEditing:(UITextField *)textField {
NSLog(@"textfield began");
textField.delegate = self;
}
答案 1 :(得分:2)
我终于找到了原因:一些第三方代码订阅了Apple的键盘 - 显示/消失器通知,并将自己删除为听众。
不幸的是,Apple的NSNotificationCenter 无法删除单个侦听器/回调选择器 - 它必须在给定的通知模式上删除所有给定实例的回调
所以,作为一个副作用,这个第三方代码正在删除我的回调选择器,即使我自己的代码都没有删除它。我在键盘通知中设置/重置委托。对于文本字段和文本视图,Apple触发键盘出现/消失方法的确切时间似乎略有不同(一致),这就是为什么行为只影响一种类型而不是另一种类型。
我的猜测是Dominic可能会遇到类似的问题 - 而且他要求重新设置代表" nudges"一些通知的时间(意外),从而修复它。
答案 2 :(得分:0)
我相信你需要在以下方法中返回true:textViewShouldEndEditing
。
如果您没有返回,则应该收到警告,因为此方法假设返回BOOL
-(BOOL)textViewShouldEndEditing:(UITextView *)textView
{
textComments.text = textView.text;
[textView.superview insertSubview:self.textComments aboveSubview:textView];
[textView removeFromSuperview];
return YES;
}