为啥 -[UIKeyInput hasText] 总是为 UITextField 返回 NO?

Posted

技术标签:

【中文标题】为啥 -[UIKeyInput hasText] 总是为 UITextField 返回 NO?【英文标题】:Why does -[UIKeyInput hasText] always return NO for UITextField?为什么 -[UIKeyInput hasText] 总是为 UITextField 返回 NO? 【发布时间】:2011-12-11 17:02:20 【问题描述】:

为什么 -[UIKeyInput hasText] 总是为 UITextField 返回 NO?这是 UIKit 的错误吗?

例如,以下测试失败:

UITextField *textField = [[UITextField alloc] initWithFrame:CGRectZero];
textField.text = @"has text";
STAssertTrue([textField hasText], @"any text is text.");

【问题讨论】:

你能补充更多细节吗?你的代码可能吗? 做了一些测试,它接缝返回NO,直到你给文本字段焦点,奇怪。 我猜UIKeyInput 协议在某种程度上与文本输入系统有关,而不是文本字段内容。例如,文本字段接缝不受对 insertText: 的调用的影响,除非它是第一响应者。如果您查看文档实际上是说“如果 backing store 有文本内容,则为 YES,否则为 NO。”。 【参考方案1】:

UITextField 通过 UITextInput 协议实现 UIKeyInput,其中声明:

UIKeyInput 协议——用于获取文本的能力 插入点的输入和删除。

(通过:http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UITextInput_Protocol/Reference/Reference.html

正如 Mattias 上面所建议的,它更多地与后备存储有关,主要用于通过系统键盘进行输入。

在您的示例中,您直接操作属性并绕过键盘输入。通过为字段提供第一响应者,将显示键盘,并且 hasText 将按预期返回 YES。

【讨论】:

以上是关于为啥 -[UIKeyInput hasText] 总是为 UITextField 返回 NO?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?