是否可以通过编程方式更新UIButton标题/文本?
-
06-07-2019 - |
题
我有一个 UIButton
,按下后会显示一个新视图,用户可以在其中更改某些设置。当视图被取消时,我想更新 UIButton
的标题/文本以反映新状态。我在打电话:
[myButton setTitle: @"myTitle" forState: UIControlStateNormal];
[myButton setTitle: @"myTitle" forState: UIControlStateApplication];
[myButton setTitle: @"myTitle" forState: UIControlStateHighlighted];
[myButton setTitle: @"myTitle" forState: UIControlStateReserved];
[myButton setTitle: @"myTitle" forState: UIControlStateSelected];
[myButton setTitle: @"myTitle" forState: UIControlStateDisabled];
但它似乎永远不会改变IB中指定的原始文本/标题。
解决方案
您是否在视图控制器类中将按钮指定为IBOutlet,并且它是否正确连接为Interface Builder中的插座(从新引用插座拖动到文件所有者并选择您的UIButton对象)?当我看到这些症状时,这通常是我遇到的问题。
编辑:虽然情况并非如此,但如果您将属性标题设置为按钮,则会发生类似这样的情况,然后您尝试更改标题而不是属性标题。
其他提示
我解决了仅为UIControlStateNormal设置title参数的问题,它自动适用于其他状态。问题似乎是当你设置另一个UIControlState时。
[myButton setTitle: @"myTitle" forState: UIControlStateNormal];
我发现了另一个问题。它可能是iOS 5中引入的一个错误,但我认为我会为遇到它的其他人指出它。
如果未在XIB中为按钮设置任何默认文本,则以编程方式设置时不会显示任何文本。如果您在XIB中设置了文本,则随后以编程方式分配给按钮的任何文本都将被截断为默认文本的大小。
最后,如果您使用按钮显示视图然后调用另一个视图(如ActionSheet)然后将其关闭,则以编程方式分配给按钮的文本将被删除,按钮标题将返回到无论你在XIB中设置什么。
即使Caffeine Coma的问题得到解决,我也想提出另一个潜在的原因,标题不会出现在UIButton上。
如果使用
为UIButton设置图像- (void)setImage:(UIImage *)image forState:(UIControlState)state
它可以涵盖标题。我发现这很困难,并想象你们中的一些人出于同样的原因最终阅读了这个页面。
请改用此方法
- (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state
按钮图像,标题不会受到影响。
我使用以.xib
创建的以编程方式创建的按钮和按钮对此进行了测试截至Swift 4:
button.setTitle("Click", for: .normal)
:
button.setTitle("Swift", forState: UIControlState.Normal)
原来,文档告诉你答案!如果UIButton已经有一个要使用的属性字符串,它将忽略标题更改(似乎是使用Xcode界面构建器时获得的默认值)。
我使用了以下内容:
[self.loginButton
setAttributedTitle:[[NSAttributedString alloc] initWithString:@"Error !!!" attributes:nil]
forState:UIControlStateDisabled];
[self.loginButton setEnabled:NO];
另一个可能的原因是:
如果您尝试在(id)initWithNibName:...
方法中设置按钮的标题,那么您的按钮属性仍然是零。尚未分配给UIButton。
您必须确保使用(void)viewWillLoad
或(void)viewWillAppear
等方法设置按钮,但您可能不希望将它们设置为(void)viewDidAppear
。
有时它会变得非常复杂。简单的方法是“刷新”按钮视图!
//Do stuff to your button here. For example:
[mybutton setEnabled:YES];
//Refresh it to new state.
[mybutton setNeedsDisplay];
我一直遇到问题,唯一的解决办法就是将图像和标签作为子视图添加到uibutton中。然后我发现主要问题是我使用的是带标题的UIButton:Attributed。当我将其更改为Plain时,只需设置titleLabel.text就可以了!
@funroll是绝对正确的。在这里,您可以看到您需要的内容确保功能仅在主线程上运行。如果您不想处理线程,您可以这样做,例如:创建NSUserDefaults并在ViewDidLoad中,在另一个视图中按下按钮状态按钮(在另一个视图中设置NSUserDefaults所需信息)并根据条件设置所需标题为你的UIButton,所以[yourButton setTitle:@" Title" forState:UIControlStateNormal];
确保你在主线上。
如果没有,它仍会保存按钮文字。当您在调试器中检查对象时它将存在。但它实际上不会更新视图。