【问题标题】:Why is my IBAction to change the text of a label not working?为什么我的 IBAction 更改标签文本不起作用?
【发布时间】:2012-04-01 01:26:00
【问题描述】:

我想在我的 iOS 应用程序中实现一个标签,当用户在文本字段中键入新字符时,它会将其值更改为文本字段的值。

因此,我在视图控制器中编写了这个 IB Action。 listenerLabelUILabel IBOutlet,textInputUITextField IBOutlet。

- (IBAction)keyboardResponse:(id)sender
{
    listenerLabel.text = textInput.text;
}

然后我在我的头文件中声明它。

- (IBAction)keyboardResponse:(id)sender;

之后,在我的 xib 文件中,我

  1. 将一行从 File's Owner 拖到两个 UI 元素,并将它们与 IBOutlets 相关联。
  2. 按 Ctrl 并单击 UIBuilder 中的文本字段,将其“Value Changed”操作关联到 IBAction keyboardResponse

但是,当我在 iOS 模拟器中运行应用程序时,标签的文本不会随着我在文本字段中键入字母而改变。为什么不呢?

【问题讨论】:

  • 你有没有试过在listenerLabel.text = textInput.text下一个断点,看看你输入的那行代码是否正在执行?
  • 感谢您的建议。我在listenerLabel.text = textInput.text; 之后写了NSLog(@"foobar") 并且日志消息从未出现过。我猜 IBAction 从来没有被调用过。我想知道为什么。当我 Ctrl+单击我的 xib 中的文本字段时,我看到 IBAction keyboardResponse 列出。
  • NSNotifications 是监听 UITextViews 变化事件的方式

标签: objective-c ios


【解决方案1】:

您需要使用通知来执行此操作。假设您将这些插座正确连接到标签和文本字段,请执行以下操作:

在 viewDidLoad 中:

[[NSNotificationCenter defaultCenter] 
     addObserver:self 
     selector:@selector(myTextChanged)
     name:UITextFieldTextDidChangeNotification 
     object:textInput];

添加这个方法(你不需要那些 IBActions

-(void)myTextChanged {
    self. listenerLabel.text = textInput.text;

}

附带说明 - 学习使用助手编辑器,它可以消除连接 IBActions 或 IBOutlets 时的错误,并自动在 viewDidUnload 中添加清理。

【讨论】:

  • 我很好奇你为什么选择使用通知而不是使用 textField 的委托,因为它在同一个视图中,并且似乎正是委托方法的设计目的。
  • 不,不是。 UITextField 没有更改文本的委托方法,只有 didBeginEditing 和 didEndEditing。 UISearchBar 有一个 textDidChange,但没有 UITextField。
  • 好点,我错过了。但是,仍然有一个委托方法:shouldChangeCharactersInRange。使用通知没有错,但我很好奇你为什么选择它而不是委托方法!
  • 这仍然无法按 OP 的意图工作。这将落后一个字符。你测试过这个吗?
【解决方案2】:

我会使用专门为此而设计的UITextFieldDelegate 方法。

  1. 让你的视图控制器采用这个协议。即在您的 .h 文件中:

    @interface YourViewController : UIViewController <UITextFieldDelegate> {

  2. 在 Interface Builder 中,将 delegatetextInput 设置为您的视图控制器。

  3. 然后在您的 .m 文件中,添加以下内容:(已编辑)

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
        if (textField == textInput) {
            listenerLabel.text  = [textField.text stringByReplacingCharactersInRange:range withString:string];;
        }
        // Note that if you don't want the characters to change in the textField 
        // you can return NO here:
        return YES;
    }
    

【讨论】:

  • 这只会在您完成编辑文本字段时发生,而不是在文本更改时实时发生。阅读问题,OP希望实时更改标签。
  • 这仍然无法按 OP 的意图工作。这将落后一个字符。你测试过这个吗?
  • 确实有效。唯一真正的区别是该方法意味着您创建了一个额外的对象(NSMutableString 对象),并且您必须将 VC 设置为 TextField 的委托。
  • 是的,在我的项目中,我将可变字符串用于其他目的,我们在这里并不需要它...已删除
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多