为啥我的 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。
listenerLabel
是 UILabel
IBOutlet,textInput
是 UITextField
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 中,将 delegate
的 textInput
设置为您的视图控制器。
然后在您的 .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 更改标签文本不起作用?的主要内容,如果未能解决你的问题,请参考以下文章