为啥我的 IBAction 更改标签文本不起作用?

Posted

技术标签:

【中文标题】为啥我的 IBAction 更改标签文本不起作用?【英文标题】: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 文件中,我

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

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

【问题讨论】:

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

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

    @interface YourViewController : UIViewController <UITextFieldDelegate>

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

    然后在您的 .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 的委托。 是的,在我的项目中,我将可变字符串用于其他目的,我们在这里并不需要它...已删除

以上是关于为啥我的 IBAction 更改标签文本不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

更改自定义 UIView 的 UILabel 文本不起作用

为啥填充在我的标签元素上不起作用?

为啥我的 XPath 选择文本不起作用?

为啥 django 中的 Simple 标签不起作用?

为啥我在 ggtext 的轴标签中使用 png 徽标的代码不起作用

为啥 git 无法识别我的文件已更改,因此 git add 不起作用