为什么textFieldDidEndEditing:没有被调用?

时间:2009-08-04 15:48:17

标签: ios objective-c cocoa-touch uitextfielddelegate

我有一个UITextField,当输入文本时,我想从文本字段中获取doubleValue并执行一些计算并在UITableView中显示它们。

UITextField的委托采用UITextFieldDelegate协议,并实现textFieldShouldReturn:和textFieldDidEndEditing:方法。 textFieldShouldReturn:取消第一响应者状态,根据文档也应该触发textFieldDidEndEditing:,但我从未看到textFieldDidEndEditing:called。

- (BOOL)textFieldShouldReturn:(UITextField*)theTextField {
    if (theTextField == thresholdValue) {
        [thresholdValue resignFirstResponder];
    }
    return YES;
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [self updateThresholdValue:textField];
}

值得注意的是,我还尝试将一些文本字段事件连接到委托并让事件直接调用updateThresholdValue:但这也不起作用。

6 个答案:

答案 0 :(得分:7)

刚遇到你描述的同样问题。在尝试了我能想到的一切之后,我添加了这个委托方法:

// if we encounter a newline character return
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{   
    // enter closes the keyboard
    if ([string isEqualToString:@"\n"])
    {
        [textField resignFirstResponder];
        return NO;
    }
    return YES;
}

现在,textFieldShouldEndEditing将触发,文本字段将重新响应第一个响应者。

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

答案 1 :(得分:6)

textFieldDidEndEditing在文本字段重新启动它的第一个响应者状态时触发,而当按下返回按钮时触发textFieldShouldReturn。

声音就像你的文本字段永远不会作为firstResponder一样辞职。您可以通过放置一些调试输出(如评论中所建议的那样)轻松地检查它,并且只需触摸即可导出文本字段 - 例如,开始键入然后只需触摸字段外部以强制它重新签名firstResponder。

不确定这是否有帮助,但听起来像是一个奇怪的案例。

答案 2 :(得分:1)

正如其中一条评论中所提到的,我尝试使用HelloWorld应用程序复制我试图做的更简单的版本,并且它在第一次尝试时工作,没有任何问题,正如预期的那样。面对这一点,我开始怀疑了一点。

在我试图找到这个问题的答案的所有谷歌搜索中的某个地方,我遇到了一个链接,其中一个人遇到了没有从按钮触发事件的问题,结果发现该问题与放置按钮的视图和具有另一个子视图的视图作为按钮的对等点,并且该子视图以某种方式吃了事件而不是允许它们去他们被定向的地方。情景与我的情况并不完全相同,但它听起来足够接近调查值得。尽管这里收到了很多优秀的建议,但没有一个能够取得成果。

昨晚我决定从头开始重新创建nib文件(复制了我的第一个文件),然后我开始工作了。关键的区别似乎是我在原始的非工作nib文件中,我从调色板拖过TableViewController,然后将其类型更改为我的子类PZTableViewController。当我在我的新笔尖中做同样的事情时,事件并没有发生。另一方面,如果我删除了被拖过的TableViewController,而只是拖过NSObject并将其类更改为PZTableViewController并将所有内容都检测到,这一切都“正常工作”

我会试着追查让我开始思考这个思路的链接,并将其作为编辑或评论发布。

这也不是一个完整的答案,因为我还不了解from-the-palette TableViewController和我的子类之间的区别。当我想出来时,我会通过编辑或评论来更新这个答案。

答案 3 :(得分:1)

我最终连接editChanged来记录文本字段的每一个更改,而不是弄清楚如何用剩余的回调覆盖所有角落案例。

非常“高效”,因为textFieldDidEndEditing(讽刺)的类似于android的“可用性”。

答案 4 :(得分:0)

如果您在视图控制器中采用了 UITextFieldDelegate 协议,那么请在 viewDidLoad 方法中编写以下代码行,以将上述协议的方法激活到相应的textFields:< / p>

override func viewDidLoad() {
    //other stuff
    yourTextField.delegate = self
}

答案 5 :(得分:0)

在我的情况下,未调用textFieldDidEndEditing:(UITextField *)textField是因为已实施textFieldDidEndEditing:(UITextField *)textField reason:(UITextFieldDidEndEditingReason)reason。由于某些原因,未在iOS 13.4上调用它。

我修复了它,只是删除了reason ...

reason回调为何停止工作的问题仍然存在,但是简短的回调仍然可以正常工作。

enter image description here