是否可以通过编程方式更新UIButton标题/文本?


96

我有一个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中指定的原始文本/标题。


2
您确定正在调用发布的代码吗?您是否放置了BREAKPOINT来证明这一点?您可以张贴您代表的签名吗?
Pablo Santa Cruz

3
顺便说一句,我相信您可以一次引用多个控件状态:[myButton setTitle:@“ myTitle” forState :( UIControlStateNormal | UIControlStateApplication | UIControlStateHighlighted | ...)]; 请注意,与逻辑或运算符(||)相反,按位或运算符的使用。通常,当您处理此类状态时,可以将它们与| 操作员。如果我误会了,有人纠正我。:)
CIFilter

我希望他们有一个像UIControlStateAll:d
泰伯

2
在iOS5中,按位组合似乎不适用于我。
Echilon '02

这里同样的问题。按位组合不适用于iOS5。/ CC @LucasTizma
znq 2012年

Answers:


52

您是否在视图控制器类中将按钮指定为IBOutlet,并且它是否已作为Interface Builder中的插座正确连接(将ctrl从新引用插座拖动到文件所有者并选择UIButton对象)?当我看到这些症状时,通常就是我遇到的问题。


编辑:虽然不是这种情况,但是如果您将属性标题设置为按钮,然后尝试更改标题而不是属性标题,也会发生类似的情况。


4
宾果游戏,就是这样,谢谢。我真的希望Objective-C在这种情况下只会抛出NullPointerException,而不是无声地假装可以向nil对象发送消息。这几乎每天都在咬我...呃!
George Armhold 09年

20
ObjC不“假装”的确定将消息发送到零,因为它确定将消息发送到零...
Jasarien

1
这里的问题不是nil指针。问题是IB设置了未在代码中正确引用的UIButton实例(通过IBOutlet),因此永远不能以编程方式对其进行操作。
2009年

112

我仅通过为UIControlStateNormal设置title参数就解决了问题,它可以自动在其他状态下工作。问题似乎出在您设置另一个UIControlState时。

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];


13

我发现了另一个问题。这可能是iOS 5中引入的错误,但是我想向遇到它的其他人指出。

如果您没有在XIB中为该按钮设置任何默认文本,那么如果以编程方式进行设置,则不会显示任何文本。而且,如果您确实在XIB中设置了文本,则随后以编程方式分配给按钮的所有文本都将被截断为默认文本的大小。

最后,如果使用按钮显示视图,然后调用另一个视图(如ActionSheet)然后将其关闭,则以编程方式分配给按钮的文本将被删除,并且按钮标题将恢复为您设置的内容在XIB中。


1
我注意到这三种行为,这确实很烦人。
跳蚤2012年

2
我遇到了截断问题(通过编程将文本更改为更长的内容),因此我在文本末尾添加了额外的空格,以“保留”该空间,以便在将文本更改为更长的单词时使用。那对我有用。
mattorb 2012年

2
看来解决此问题的方法是使用方法[_button setTitle:@“ title” forState:UIControlStateNormal]; 而不是直接访问_button.titleLabel.text属性。坚持使用方法调用,您可能会得到所需的结果。
Rymnel

12

尽管Caffeine Coma的问题已解决,但我想提供另一个可能的原因,使标题不显示在UIButton上。

如果您使用设置UIButton的图像

- (void)setImage:(UIImage *)image forState:(UIControlState)state

它可以覆盖标题。我发现这种方法很困难,并且可以想象某些人出于同样的原因而最终阅读此页面。

改用此方法

- (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state

按钮图像和标题将不会受到影响。

我使用以编程方式创建的按钮和在.xib中创建的按钮进行了测试



4

原来文档告诉你答案!如果UIButton已经使用了属性字符串,则它将忽略标题更改(似乎是使用Xcode接口构建器时获得的默认字符串)。

我使用了以下内容:

[self.loginButton 
     setAttributedTitle:[[NSAttributedString alloc] initWithString:@"Error !!!" attributes:nil] 
     forState:UIControlStateDisabled];
[self.loginButton setEnabled:NO];

3

另一个可能的原因是:

如果您尝试在(id)initWithNibName: ...方法中设置按钮的标题,那么您的button属性仍然为nil。尚未分配给UIButton。

您必须确保要使用诸如(void)viewWillLoad或的方法来设置按钮(void)viewWillAppear,但是您可能不想将它们设置为迟到(void)viewDidAppear


2

有时它会变得非常复杂。简单的方法是“ 刷新 ”按钮视图!

//Do stuff to your button here.  For example:

[mybutton setEnabled:YES];

//Refresh it to new state.

[mybutton setNeedsDisplay];

1

我对此一直有问题,唯一的解决方案是将图像和标签作为子视图添加到uibutton。然后我发现主要问题是我正在使用标题为Attributed的UIButton。当我将其更改为Plain时,只需设置titleLabel.text就可以了!


1

@funroll是绝对正确的。在这里,您可以看到所需的内容。确保函数仅在主线程上运行。如果您不希望处理线程,则可以这样操作:例如,创建NSUserDefaults并在ViewDidLoad中阻塞条件是否在另一个视图中按下了按钮(在NSUserDefaults中的另一个视图中设置了所需信息),并根据条件设置了所需标题您的UIButton,因此[yourButton setTitle:@“ Title” forState:UIControlStateNormal];


事实证明,如果您从后台线程调用setTitle和setNeedsDisplay,则视图将在以后更新。
user1111828

0

确保您在主线程上。

如果不是,它将仍然保存按钮文本。当您在调试器中检查对象时,它将在那里。但是它实际上不会更新视图。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.