关于ios:为什么textFieldDidEndEditing:没有被调用?

Why is textFieldDidEndEditing: not being called?

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

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

1
2
3
4
5
6
7
8
9
10
- (BOOL)textFieldShouldReturn:(UITextField*)theTextField {
    if (theTextField == thresholdValue) {
        [thresholdValue resignFirstResponder];
    }
    return YES;
}

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

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


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

1
2
3
4
5
6
7
8
9
10
11
12
// if we encounter a newline character return
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{  
    // enter closes the keyboard
    if ([string isEqualToString:@"
"
])
    {
        [textField resignFirstResponder];
        return NO;
    }
    return YES;
}

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

1
2
3
4
5
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}


textFieldDidEndEditing在文本字段重新设置其第一个响应者状态时触发,而在按下返回按钮时触发textFieldShouldReturn。

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

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


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

1
2
3
4
override func viewDidLoad() {
    //other stuff
    yourTextField.delegate = self
}

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

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


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

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

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

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

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