为什么textFieldDidEndEditing: 没有被调用?

问题描述 投票:0回答:8

我有一个 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: ,但这也不起作用。

ios objective-c cocoa-touch uitextfielddelegate
8个回答
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;
}

7
投票

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

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

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


4
投票
如果您的视图控制器采用了

UITextFieldDelegate 协议,则在 viewDidLoad 方法中编写以下代码行,以将上述协议的方法激活到相应的文本字段:

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

2
投票
正如其中一条评论中提到的,我尝试使用 HelloWorld 应用程序复制我尝试执行的操作的更简单版本,并且它在第一次尝试中就成功了,没有任何问题,正如预期的那样。面对这一点,我开始有点疑惑。

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

昨晚我决定从头开始完全重新创建 nib 文件(复制了我之前拥有的文件),并且我让它工作了。关键的区别似乎是,在原始的非工作笔尖文件中,我从调色板中拖动了

TableViewController

,然后将其类型更改为我的子类 
PZTableViewController
。当我在新笔尖上做同样的事情时,事件没有触发。另一方面,如果我删除了拖拽的 
TableViewController
,而只是拖过 
NSObject
 并将其类更改为 
PZTableViewController
 并将所有内容都连接起来,那么一切都“正常工作”。

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

这也不是一个完整的答案,因为我还不明白调色板

TableViewController

和我的子类之间的区别。当我弄清楚这一点时,我将通过编辑或评论更新此答案。


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

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


1
投票
在我的例子中,

textFieldDidEndEditing:(UITextField *)textField

没有被调用,因为它被实现了
textFieldDidEndEditing:(UITextField *)textField reason:(UITextFieldDidEndEditingReason)reason
。由于某种原因,在 iOS 13.4 上它没有被调用。

我修复了它,只是删除了

reason ...

为什么

reason

 回调停止工作的问题仍然悬而未决,但短回调工作正常。


0
投票
只有几条注释,特别是如果您只有 1 个编辑字段: 调用resignFirstController。

见下图:

//MARK: UITextFieldDelegate func textFieldDidEndEditing(_ textField: UITextField) { let s=textField.text ?? "0" let value = Double(s) ?? 0.0 textField.resignFirstResponder() // Preferences.shared.ms = value } func textFieldShouldReturn(_ textField: UITextField) -> Bool { print("should return called.." ) textField.resignFirstResponder() return true }
    

0
投票
简单添加委托并使用下面的代码

TextField.delegate = self func textFieldDidEndEditing(_ textField: UITextField, Reason: UITextField.DidEndEditingReason) { self.calculateZmiles(金额:self.TextField.text ?? "") }

© www.soinside.com 2019 - 2024. All rights reserved.