textViewDidEndEditing:未被调用

时间:2011-12-12 18:04:04

标签: iphone uikit uitextfield uitextview

我是用UITextView以编程方式替换UITextField,但这似乎打破了Apple代码中的某些内容。

执行交换的类是两者的委托。 FIELD上的所有委托方法都正常工作 - 我使用“didBeginEditing”来触发来自FIELD的交换 - > VIEW。

还可以正确调用VIEW上的didBeginEditing / shouldBeginEditing方法。

但是... VIEW委托上的shouldEndEditing / didEndEditing方法是从不调用。无论我如何移除焦点,它们都不会被调用(我将它们打破,也可以使用日志语句)。例如没有以下工作:

  1. 点击屏幕上的其他文本字段(FIELD委托获取“shouldBegin”和“didBegin” - VIEW委托获取没有
  2. 在背景视图上使用手势识别器为屏幕上的每个元素调用“resignFirstResponder”(如果选择了不同的字段,则FIELD委托获取“shouldEnd”和“didEnd”.VIEW得到 nothing 即使它已被选中)
  3. 调用应该/确实开始方法的事实表明委托已经分配好了,并且运行正常 - 但是为什么/如何忽略应该/做的结束方法?就好像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" );
    }
    

3 个答案:

答案 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;
}