问题 为什么textFieldDidEndEditing:没有被调用?


我正在玩我的第一个iphone应用程序; SDK 3.0。我有一个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:但这也不起作用。


8676
2017-08-04 15:48


起源

放置一些NSLog以确保从未实际调用该方法。 - mk12
我假设他的委托正确连接,否则textFieldShouldReturn:也不会被调用。 - Luke Redpath
但我同意你的第一条评论 - 你是否尝试过NSLog或设置一个断点来确认代理没有被调用?难道它被召唤但是 [self updateThresholdValue:textField]; 是不是按照你的期望去做? - Luke Redpath
我没有用过NSLog();我在textFieldDidEndEditing的实现中设置了一个断点:它没有被触发。 textFieldShouldReturn中的类似断点:确实触发。 - Chris Cleeland
关于field.delegate = self ...不,我还没有这样做。委托是UIViewController的子类,它控制文本字段所在的视图。我发誓昨晚我读到UITextFields不能成为他们自己的代表。等等......我明白你在说什么。你想知道我是否连接了textfield的委托。是。这是在IB中完成的,正如Luke所说,正在调用textFieldShouldReturn:这一事实似乎表明该委托已正确设置。 - Chris Cleeland


答案:


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

// 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;
}

7
2017-12-09 13:22



现在考虑在同一个VC上有两个UITextField的情况。在输入时辞职kbd是个好主意吗? - Anton Tropashko


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

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

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


6
2017-08-04 20:59



谢谢你的说明。看一下我在初始问题中添加的代码。 testFieldShouldReturn:调用resignFirstResponder,我已经确认通过调试器执行代码的辞职行。 textFieldDidEndEditing:是否作为resignFirstResponder执行的一部分被调用,或者是否发生 后 resignFirstResponder完成执行?最后,如果它很重要,我仍然在模拟器而不是实际设备中运行。我还没有神奇的钥匙。 - Chris Cleeland
关于这个的更多信息...我掏出HelloWorld演示应用程序 - 有一个文本字段,按钮和标签:在字段中键入文本,点击按钮,标签更新。我修改了笔尖,以便标签将“Editing Did End”事件发送到该按钮使用的同一对象和动作。它奏效了。所以,我回到上面描述的我的应用程序并做了同样的事情......它没有用。必须有一些微妙的不同,但到目前为止我还没有发现它。 - Chris Cleeland
我要检查的另一件事是textFieldDidEndEditing的方法签名 究竟匹配来自api文档的签名,它对我来说是正确的,但是如果有任何错误,则委托方法将永远不会被调用。实际上,您可以直接从API文档中复制签名。 - paulthenerd
保罗的优秀建议。不幸的是,我已经尝试过无济于事。请参阅我的后续答案即将添加。 - Chris Cleeland
应该接受答案。 - inokey


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

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

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

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

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


1
2017-08-06 14:53





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

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


1
2018-03-30 12:10