13

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

UITextField 的委托采用 UITextFieldDelegate 协议,并实现了 textFieldShouldReturn: 和 textFieldDidEndEditing: 方法。textFieldShouldReturn: 辞去第一响应者状态,根据文档也应该触发 textFieldDidEndEditing:,但我从未见过 textFieldDidEndEditing: 调用。

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

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

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

4

6 回答 6

9

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

// 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;
}
于 2010-12-09T13:22:41.517 回答
7

textFieldDidEndEditing 在文本字段退出其第一响应者状态时触发,而 textFieldShouldReturn 在按下返回按钮时触发。

听起来您的文本字段永远不会辞去 firstResponder 的职务。您可以通过放置一些调试输出(如评论中的建议)并通过触摸导航出文本字段来轻松检查它 - 例如,开始输入然后只需触摸字段外部以强制它退出 firstResponder。

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

于 2009-08-04T20:59:16.797 回答
3

如果您在视图控制器中采用了UITextFieldDelegate协议,则在viewDidLoad方法中编写以下代码行以将上述协议的方法激活到您相应的文本字段:

override func viewDidLoad() {
    //other stuff
    yourTextField.delegate = self
}
于 2019-01-08T10:07:05.427 回答
2

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

在我试图找到这个问题的答案的所有谷歌搜索中,我遇到了一个链接,其中一个人遇到了事件没有从按钮触发的问题,结果证明问题与视图有关按钮被放置在哪个视图中,并且该视图具有另一个子视图作为按钮的对等点,并且该子视图以某种方式吞噬了事件,而不是允许它们去他们被引导的地方。场景和我的不完全一样,但听起来足够接近,值得调查。尽管在这里收到了所有优秀的建议,但还没有一个结果。

昨晚我决定从头开始完全重新创建 nib 文件(复制我最初拥有的文件),然后我让它工作了。关键的区别似乎是我在原始的非工作 nib 文件中,我TableViewController从调色板中拖了 a ,然后将其类型更改为我的 subclass PZTableViewController。当我在我的新笔尖上做同样的事情时,事件并没有触发。另一方面,如果我删除了拖过的东西TableViewController,而只是拖过 anNSObject并将其类更改为PZTableViewController并将所有内容都竖起来,这一切都“正常工作”。

我将尝试追踪让我开始思考这一思路的链接,并将其作为编辑或评论发布。

这也不是一个完整的答案,因为我还不明白从调色板TableViewController和我的子类之间的区别。当我弄清楚这一点时,我将通过编辑或评论来更新这个答案。

于 2009-08-06T14:53:08.697 回答
1

我最终连接了 editingChanged 以记录对文本字段的每一次更改,而不是弄清楚如何用剩余的回调覆盖所有极端情况。

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

于 2016-03-30T12:10:22.267 回答
1

在我的情况下textFieldDidEndEditing:(UITextField *)textField没有被调用,因为它被实施了textFieldDidEndEditing:(UITextField *)textField reason:(UITextFieldDidEndEditingReason)reason。出于某种原因,在 iOS 13.4 上它没有被调用。

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

为什么reason回调停止工作的问题仍然存在,但短的工作正常。

在此处输入图像描述

于 2020-06-17T11:16:34.993 回答