98

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

4

12 回答 12

115

我只为 UIControlStateNormal 设置了标题参数就解决了这个问题,它会自动在其他状态下工作。问题似乎出在您设置另一个 UIControlState 时。

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];
于 2011-05-19T17:45:13.660 回答
52

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


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

于 2009-06-23T16:52:16.287 回答
17

从 Swift 4 开始:

    button.setTitle("Click", for: .normal)
于 2015-03-05T07:16:18.570 回答
13

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

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

最后,如果您使用按钮显示视图,然后调用另一个视图(如 ActionSheet)然后关闭它,您以编程方式分配给按钮的文本将被删除,按钮标题将返回到您设置的任何内容在XIB中。

于 2011-11-15T11:29:56.630 回答
12

尽管咖啡因昏迷的问题得到了解决,但我想提供另一个导致标题未显示在 UIButton 上的潜在原因。

如果您使用为 UIButton 设置图像

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

它可以覆盖标题。我很难找到这一点,并想象你们中的一些人最终会出于同样的原因阅读此页面。

改用此方法

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

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

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

于 2011-10-27T07:00:05.867 回答
7

快速:

button.setTitle("Swift", forState: UIControlState.Normal)                   
于 2015-12-21T08:20:08.057 回答
4

原来文档告诉你答案!如果 UIButton 已经有要使用的属性字符串(似乎是使用 Xcode 界面生成器时获得的默认值),则 UIButton 将忽略标题更改。

我使用了以下内容:

[self.loginButton 
     setAttributedTitle:[[NSAttributedString alloc] initWithString:@"Error !!!" attributes:nil] 
     forState:UIControlStateDisabled];
[self.loginButton setEnabled:NO];
于 2014-08-20T17:51:02.337 回答
3

另一个可能的原因是:

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

您必须确保您正在使用类似(void)viewWillLoador的方法设置按钮(void)viewWillAppear,但您可能不想将它们设置为(void)viewDidAppear.

于 2012-11-27T23:47:46.467 回答
2

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

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

[mybutton setEnabled:YES];

//Refresh it to new state.

[mybutton setNeedsDisplay];
于 2013-03-01T05:11:42.630 回答
1

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

于 2013-02-08T14:55:57.823 回答
1

@funroll 是绝对正确的。在这里你可以看到你需要什么确保函数只在主线程上运行。如果您不想处理线程,您可以这样做,例如:创建 NSUserDefaults 并在 ViewDidLoad 中检查条件是否按下了另一个视图中的按钮(在另一个视图中设置为 NSUserDefaults 所需的信息),并取决于设置的条件所需的标题你的 UIButton,所以 [yourButton setTitle: @"Title" forState: UIControlStateNormal];

于 2013-11-23T12:18:08.013 回答
0

确保你在主线程上。

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

于 2013-01-12T05:32:20.453 回答