我有一个 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: ,但这也不起作用。
刚刚遇到了您描述的同样问题。在尝试了我能想到的一切之后,我添加了这个委托方法:
// 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;
}
textFieldDidEndEditing 在文本字段放弃其第一响应者状态时被触发,而 textFieldShouldReturn 在按下返回按钮时被触发。
听起来就像您的文本字段永远不会辞去第一个响应者的角色。您可以通过放置一些调试输出(如评论中所建议的)并只需通过触摸导航出文本字段来轻松检查它 - 例如开始输入,然后只需触摸字段外部以强制其退出firstResponder。
不确定这是否有很大帮助,但这听起来像是你遇到的一个奇怪的情况。
UITextFieldDelegate 协议,则在 viewDidLoad 方法中编写以下代码行,以将上述协议的方法激活到相应的文本字段:
override func viewDidLoad() {
//other stuff
yourTextField.delegate = self
}
在我试图找到这个问题的答案的所有谷歌搜索中,我遇到了一个链接,其中一个人遇到了事件未从按钮触发的问题,结果证明该问题与视图有关其中放置了按钮,并且该视图具有另一个子视图作为按钮的对等点,并且该子视图以某种方式吞噬了事件,而不是允许它们到达它们被引导的位置。这个场景与我的并不完全相同,但听起来足够接近,值得进行调查。尽管这里收到了所有极好的建议,但还没有取得成果。
昨晚我决定从头开始完全重新创建 nib 文件(复制了我之前拥有的文件),并且我让它工作了。关键的区别似乎是,在原始的非工作笔尖文件中,我从调色板中拖动了
TableViewController
,然后将其类型更改为我的子类
PZTableViewController
。当我在新笔尖上做同样的事情时,事件没有触发。另一方面,如果我删除了拖拽的
TableViewController
,而只是拖过
NSObject
并将其类更改为
PZTableViewController
并将所有内容都连接起来,那么一切都“正常工作”。我将尝试追踪让我开始这种思路的链接,并将其作为编辑或评论发布。
这也不是一个完整的答案,因为我还不明白调色板
TableViewController
和我的子类之间的区别。当我弄清楚这一点时,我将通过编辑或评论更新此答案。
非常“高效”,因为 textFieldDidEndEditing 具有类似于 Android 的“可用性”(讽刺)。
见下图:
//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
}
TextField.delegate = self func textFieldDidEndEditing(_ textField: UITextField, Reason: UITextField.DidEndEditingReason) { self.calculateZmiles(金额:self.TextField.text ?? "") }