在输入击键时获取UITextField的值?


107

假设我有以下代码:

IBOutlet UITextField* nameTextField;
IBOutlet UILabel* greetingLabel;

我希望greetingLabel用户按下任意键后立即阅读“ Hello [nameTextField]”。

我基本上需要的是与Cocoa委托方法等效的iPhone controlTextDidChange

textField:shouldChangeCharactersInRange:委托方法被称为每个键击发生时:

- (BOOL)              textField:(UITextField *)textField
  shouldChangeCharactersInRange:(NSRange)range     
              replacementString:(NSString *)string

字符串参数返回被按下的字符。但是,实际textField的值(nameTextField.text)保留为空白。

我在这里想念什么?(我想nameTextField反映用户到目前为止输入的确切字符串)。

Answers:


197

事实证明,最简单的方法是使用Interface Builder:

  • 添加一个IBAction(例如,在这种情况下,添加到ViewController中)
  • 在Interface Builder中的UITextField上按住Ctrl键单击(或右键单击)
  • 将“编辑已更改”事件连接到第一步中添加的文件所有者的IBAction。

就像魅力一样工作:)(我不敢相信我花了很多天时间,现在意识到解决方案比我想象的要简单得多:P)


2
谢谢!我一直在使用“ Value Changed”,就像您在UISlider等上使用的那样。有趣的是,它们有两个似乎具有相同行为的事件。
wjl 2011年

1
由于某种原因,我仍然想要一种编程的方式来执行此操作...但是我屈服了...这种方法很糟糕!谢谢你的分享...我以前看过它,但是经过几天的编码,我的大脑不再起作用了。
艾伯特·伦肖

8
@AlbertRenshaw但是,您可以通过编程的方式来做到这一点;)只需执行[textField addTarget:self action:@selector(textFieldEditingChanged:) forControlEvents:UIControlEventEditingChanged];)。
Vive

101

您可以在文本字段上为事件UIControlEventEditingChanges注册一个动作:

[nameTextField addTarget:self action:@selector(updateLabelUsingContentsOfTextField:) forControlEvents:UIControlEventEditingChanged];

...

// TODO: error checking

- (void)updateLabelUsingContentsOfTextField:(id)sender {

    greetingLabel.text = [NSString stringWithFormat:@"Hello %@", ((UITextField *)sender).text];

}

有没有一种方法可以使用Interface Builder进行指定?
PlagueHammer

11

UITextField有一个通知UITextFieldTextDidChange,如果您进行注册,则每次文本更改时都会触发该通知。只需注册该通知,然后在该通知所调用的方法中,更改标签的文本。

除此之外,传递给您的通知处理程序的对象将具有的文本UITextField

希望有帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.