44

UIButton当用户单击它时,我正在尝试更改我以编程方式创建的标题。所以,这是我创建的代码UIButton

myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, parentView.frame.size.width, parentView.frame.size.height)];
[myButton setBackgroundColor:[UIColor blackColor]];
[myButton setAlpha:0.7];
[myButton setTitle:@"Hello" forState:UIControlStateNormal];
[myButton addTarget:self action:@selector(userClicked:) forControlEvents:UIControlEventTouchUpInside];

[parentView addSubview:myButton];

而且,在我的userClicked:方法中,我这样做:

-(void) userClicked:(UIButton*)button
{
    NSLog(@"USER CLICKED!!!");
    if ([NSThread isMainThread])
    {
        NSLog(@"is main thread");
    }

    [button setTitle:@"Bye" forState:UIControlStateHighlighted];
    [button setTitle:@"Bye" forState:UIControlStateNormal];
    [button setTitle:@"Bye" forState:UIControlStateSelected];

    [self someLengthyComputation];
}

奇怪的是我可以看到打印的日志消息:

USER CLICKED!!! 
isMainThread

但是,按钮的标题不会改变!我究竟做错了什么?

编辑:为几个州设置标题也不起作用。

EDIT2:如果我在 Xcode 的调试器窗口中打印按钮的描述,它会显示正确的标题!

Printing description of button->_titleView:
<UIButtonLabel: 0xa4c9310; frame = (95 216; 130 22); text = 'Bye'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xa44f080>>
4

24 回答 24

51

这对我更新标题文本(iOS 7.1,Xcode 5.1)有用:

button.enabled = FALSE;
[button setTitle:@"Test" forState:UIControlStateNormal];
button.enabled = TRUE;
于 2014-03-20T09:09:58.907 回答
28

I was having the same problem, and I noticed that everywhere else I was setting the attributedTitle. So any updates to the title were not affecting the attributed title.

My solution:

[button setAttributedTitle:@"" forState:UIControlStateNormal];

instead of

[button setTitle:@"" forState:UIControlStateNormal];
于 2014-06-16T17:25:23.140 回答
21

目前,我完成的最短的工作是调用:

[button setNeedsLayout];

更新标题后。

这似乎发生在 iOS 7.1 中。在 Xcode 5.1.1 SDK 7.1 中编译时,我所有的按钮在以前的 iOS 版本中表现正确(或者可能只是用以前的 SDK 编译)突然停止这样做。

看起来像苹果的错误。

于 2014-06-02T09:54:15.300 回答
12

我在使用故事板时遇到了类似的问题。使用上面的答案我不得不使用

[mybutton setTitle:@"SomeText" forState:UIControlStateNormal];
[button setNeedsLayout];
[button layoutIfNeeded];

而且我必须确保属性检查器中的按钮类型是“自定义”而不是“系统”。

于 2015-01-09T06:43:06.950 回答
8

请看看这是否对你有帮助......当按钮被点击时检查条件是否按钮切换......当你有像 changeButtonText 这样的功能时,如下所示

-(IBAction)changeButtonText:(id)sender {
    if (!buttonToggled) {
        [sender setTitle:@"Initial Text" forState:UIControlStateNormal];
        buttonToggled = YES;
    } else {
        [sender setTitle:@"Alternative Text" forState:UIControlStateNormal];
        buttonToggled = NO;
    }
}
于 2013-11-14T09:17:12.390 回答
6

您的代码中有几个问题:

您正在为按钮分配回调:

@selector(userClicked:)

但你的代码是另一种方法:

-(void)userTapOnTapToRefreshView:(UIButton*)button

要解决这个问题,您需要实现以下内容:

-(void)userClicked:(id)sender
{
    [(UIButton*)sender setTitle:@"Bye" forState:UIControlStateNormal];
}

这部分代码对我来说也没有意义:

[parentView myButton];

尝试将其更改为:

[parentView addSubview:myButton];

希望它会有所帮助:)

于 2013-11-14T09:38:32.167 回答
6

对于Swift 35,只需使用以下命令:

button.setTitle("My title", for: .normal)

或者对于属性文本使用这个:

button.setAttributedTitle(<AttributedString>, for: .normal)
于 2017-03-22T15:41:11.803 回答
5

这有点晚了,有点与沃尔特舒尔特的回应有关:

我有一个类似的问题,我的按钮文本设置正确,直到我更新到 7.1。然后我发现,由于我的按钮被禁用,我必须为禁用状态设置标题颜色和标题文本才能显示文本。然后一切都像魅力一样!

于 2014-04-09T18:32:04.983 回答
5

在 iOS 7 中,UIButton 的标题在禁用时不会更新。这似乎是 iOS 7 上的一个错误。

作为一种解决方法,更新正常和禁用的标题。有用!

[button setTitle:title forState:UIControlStateNormal];
[button setTitle:title forState:UIControlStateDisabled];
于 2015-03-06T02:19:36.527 回答
4

尝试这个:

[button setTitle:@"Bye" forState:UIControlStateHighlighted];

或者:

[button setTitle:@"Bye" forState:UIControlStateSelected];

您还可以修改 void 函数:

-(void) userClicked
{
    NSLog(@"USER CLICKED!!!");
    if ([NSThread isMainThread])
    {
        NSLog(@"is main thread");
    }

    [myButton setTitle:@"Bye" forState:UIControlStateNormal];
}
于 2013-11-14T09:16:31.923 回答
4

就我而言,我尝试了一切,但没有任何效果。然后我只是将按钮类型从系统更改为故事板中的自定义。繁荣!一切开始正常。

于 2016-04-27T13:15:45.723 回答
4

将按钮类型更改为“自定义”,而不是“系统”,它将按预期工作:)

于 2017-02-04T09:25:03.270 回答
3

可能是按钮布局刷新问题.....尝试使用...

[button setNeedsLayout];
[button layoutIfNeeded];

它将强制按钮更新布局。

于 2014-10-14T14:18:01.517 回答
3

好吧,这完全是关于 UIButton 的启用状态,Apple 在 7.1 中更改了一些内容,如果 UIButton 处于禁用状态,则不允许您更改标题,仅此而已。

谢谢苹果,我已经失去了 10 分钟。调试运行良好的应用程序。

今天早上才发现,昨天更新 XCode 到 5.1.1 和 iOS 到 7.1

于 2014-05-08T10:08:28.780 回答
2

最后,我想通了。有两个问题:

1)button不在状态UIControlStateNormal

2)我在设置标题后调用了一个执行长时间计算的方法,[self someLengthyComputation].

我已经通过以下方式解决了这个问题:

1)为按钮的所有状态设置标题。

2)在另一个线程中执行大计算,而不是主线程。

我现在的工作代码是:

-(void) userClicked:(UIButton*)button
{
    NSLog(@"USER CLICKED!!!");
    if ([NSThread isMainThread])
    {
        NSLog(@"is main thread");
    }

    [button setTitle:@"Bye" forState:UIControlStateHighlighted];
    [button setTitle:@"Bye" forState:UIControlStateNormal];
    [button setTitle:@"Bye" forState:UIControlStateSelected];
    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
        [self someLengthyComputation];
    });
}

非常感谢所有回答/评论的人!

于 2013-11-14T10:12:34.910 回答
2

这可能是微不足道的,但是如果您设置一些按钮图像(而不是背景图像)填充整个按钮框架,这将向右移动标题并使其不可见。如果是这样,请尝试将按钮图像更改为背景图像。

于 2016-01-19T10:10:26.970 回答
1

根据 Apple 开发人员指南,您不应将按钮标题标签文本或颜色直接设置为属性(例如,要这样做:myButton.titleLabel.text=@"SomeText" 或 myButton.titleLabel.textColor=[UIColor blackColor ])。

相反,您可以使用 UIButton 设置器功能设置它们,如下所示:

    [myButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

...或者像这样:

    [myButton setTitle:@"SomeText" forState:UIControlStateNormal];.

请参阅Apple 指南

于 2014-06-13T19:13:00.447 回答
1

没有要求使用:

[button setNeedsLayout];
[button layoutIfNeeded];

相反,首先将 type 设置为 DEFAULT 到CUSTOM

如果您申请setAttributedTitle了,请使用:

[button setAttributedTitle:[NSAttributedString new] forState:UIControlStateNormal];

否则没有必要改变任何东西。

如果文本的颜色没有改变,则应用相同的内容并设置标题颜色:

[button setTitleColor:[any_color] forState:UIControlStateNormal];
于 2016-07-23T12:38:33.897 回答
1

以上都不适用于我的情况(我在用 UIPopoverController 呈现的视图顶部有一个按钮),我必须在 setTitle 之前 removeFromSuperview,然后 addSubview 回来 - 希望这可以帮助有类似问题的人

于 2017-06-11T07:27:34.443 回答
1

尝试了许多解决方案后的结论是使用 setAttributedTitle 而不是 setTitle。

要为 AttributedString 制作标题字符串:

NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:@" new Test "];

[button setAttributedTitle:attString forState:UIControlStateNormal];

顺便说一下,这个问题在正常情况下不是偶尔发生,而是突然发生,主要有以下几个原因:

  1. 如果您更改 a 的启用状态UIButton并尝试更改标题。

  2. 如果您使用属性值,然后想使用 setTitle 更改它,则在这种情况下,属性值优于标题。

  3. 如果您导航到另一个视图控制器,然后返回以更新按钮标题。

于 2016-08-22T09:14:03.810 回答
0

我怀疑作为参数传入的“按钮”是否是 myButton。无论如何,如果 myButton 是成员变量,则可以 [myButton setTitle:@"Bye" forState:UIControlStateNormal];

于 2013-11-14T09:32:32.670 回答
0

而不是 yourButton.titleLabel?.text = "T"

使用这个 yourButton.setTitle("TITLE", for: .normal)

于 2018-10-23T06:18:02.390 回答
0

尝试在界面或视图/视图控制器的实现部分中将按钮声明为属性

@property(nonatomic,strong) UIButton* myButton;

然后创建它

self.myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, parentView.frame.size.width, parentView.frame.size.height)];
[_myButton setBackgroundColor:[UIColor blackColor]];
...

它应该工作。不要问我为什么真的 - 我只是认为这都是关于 ARC / 现代内存管理..

编辑:

如果您在实现中保留对按钮的引用,它也应该起作用..

@implementation myViewController
{
    UIButton* myButton;
}

-(void)createButton
{
    myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, parentView.frame.size.width, parentView.frame.size.height)];
    [myButton setBackgroundColor:[UIColor blackColor]];
    ...
}

...
于 2016-09-05T19:00:03.670 回答
-1

始终在 UIButton 上设置文本之前执行 addSubview。

于 2014-09-03T21:01:47.943 回答