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反映用户到目前为止输入的确切字符串)。

4

3 回答 3

198

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

  • 添加一个 IBAction(例如,在本例中添加到 ViewController)
  • 在 Interface Builder 中的 UITextField 上按住 Ctrl 键单击(或右键单击)
  • 将“Editing Changed”事件连接到第一步中添加的 File's Owner's IBAction。

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

于 2008-12-23T10:26:52.737 回答
102

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

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

...

// TODO: error checking

- (void)updateLabelUsingContentsOfTextField:(id)sender {

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

}
于 2008-12-23T08:19:22.043 回答
11

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

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

希望有帮助。

于 2008-12-23T09:34:31.890 回答