iOS SDK:UIButton setTitleForState和UIButton titleLabel.text之间的差异

iOS SDK:UIButton setTitleForState和UIButton titleLabel.text之间的差异,ios,objective-c,cocoa-touch,ios9,Ios,Objective C,Cocoa Touch,Ios9,我有一个自定义UIView的问题,其中我有一个UIButton子视图,我想在初始化时根据如下条件设置按钮的文本: - (void)awakeFromNib { [super awakeFromNib]; //check for some conditions self.testButton.titleLabel.text=@"Some Title"; } - (IBAction)otherButtonClicked:(id)sender { self.testButton.titleL

我有一个自定义UIView的问题,其中我有一个UIButton子视图,我想在初始化时根据如下条件设置按钮的文本:

- (void)awakeFromNib {
    [super awakeFromNib];
//check for some conditions
self.testButton.titleLabel.text=@"Some Title";
}
- (IBAction)otherButtonClicked:(id)sender {
self.testButton.titleLabel.text=@"Some Title";
}
没有发生任何事情,按钮的文本与nib文件中定义的文本相同,但是如果我将实现更改为:

- (void)awakeFromNib {
    [super awakeFromNib];
//check for some conditions
    [self.testButton setTitle:@"Some Title" forState:UIControlStateNormal];
}
它按预期工作

有人能给我解释一下这两种方法的区别吗?什么时候使用

编辑:

建议的答案不能解释我的情况,我测试了从另一个按钮的操作更改按钮的文本,如下所示:

- (void)awakeFromNib {
    [super awakeFromNib];
//check for some conditions
self.testButton.titleLabel.text=@"Some Title";
}
- (IBAction)otherButtonClicked:(id)sender {
self.testButton.titleLabel.text=@"Some Title";
}

按钮的文本也改变了。我只是想了解这种行为。

标题标签访问权限用于调整标签的其他属性,如
font
,但设置
标题标签
文本不起作用


这是因为
ui按钮
类具有内部实现,可以根据按钮的不同状态设置文本,如
选中/突出显示的
等,这些状态会覆盖标签文本。

提供了标题标签访问权限,以调整标签的其他属性,如
字体
,但设置
标题标签
文本则没有工作

这是因为
ui按钮
类具有内部实现,可以根据按钮的不同状态设置文本,如
选中/突出显示的
等,这些状态会覆盖标签文本。

确切答案是

不要使用标签对象设置文字颜色或阴影颜色。相反,可以使用此类的setTitleColor:forState:和setTitleShadowColor:forState:方法进行这些更改

titleLabel属性返回一个值,即使按钮没有 已经展示过了系统的属性值为零 按钮

使用此方法设置按钮的标题。您指定的标题 从按钮的关联标签对象派生其格式。如果 为按钮设置标题和属性化标题 按钮更喜欢使用属性化标题而不是此标题

至少,您应该设置正常状态的值。如果 未为状态指定标题,默认行为是使用 与uicontrol状态正常状态关联的标题。如果 UIControlStateNormal未设置,则属性默认为 系统价值

确切的答案是

不要使用标签对象设置文字颜色或阴影颜色。相反,可以使用此类的setTitleColor:forState:和setTitleShadowColor:forState:方法进行这些更改

titleLabel属性返回一个值,即使按钮没有 已经展示过了系统的属性值为零 按钮

使用此方法设置按钮的标题。您指定的标题 从按钮的关联标签对象派生其格式。如果 为按钮设置标题和属性化标题 按钮更喜欢使用属性化标题而不是此标题

至少,您应该设置正常状态的值。如果 未为状态指定标题,默认行为是使用 与uicontrol状态正常状态关联的标题。如果 UIControlStateNormal未设置,则属性默认为 系统价值


被接受的答案是正确的,我只是在这里加上这个来详细说明一下(评论太短)

这里没什么好解释的。标题根本不是为了设置文本。我猜想,
UIButton
的内部工作方式也会使它将文本保存到其他地方(针对不同的状态)。它使用一个普通的
ui标签
来最终显示它,因为这很方便,也很容易理解。设置该按钮的文本并不会在所有情况下更改按钮,这可能最终取决于绘图周期。我假设当它被绘制、布局或类似的东西时,它会在某个点上用另一个保存的变体“替换”标签的文本

现在,你可能想知道为什么苹果当时公开了UILabel,并因此使文本变得可编辑

遗留问题可能是这个决定的一个方面(IIRC您可以这样设置按钮的标题)。虽然旧代码不会产生所需的行为,但至少不会立即崩溃。此外,许多代码只是希望得到文本,并希望得到一个标签,这与以往一样完美

第二,完全不同的设计似乎有些过分。为了避免这种情况,他们必须使用UILabel的子类,该子类阻止您设置文本或其他内容并使用它。或者完全跳过它(以及遗留支持),只提供
setTitle:forState:
方法。对于标签这样的简单文本容器来说,这似乎有点过分


最终,这是苹果公司的设计选择。您不能直接设置标题文本,在任何情况下,除了使用
setTitle:forState:

之外,您都不应该以任何方式设置标题文本。公认的答案是正确的,我只是在这里加上这个来详细说明一下(注释太短)

这里没什么好解释的。标题根本不是为了设置文本。我猜想,
UIButton
的内部工作方式也会使它将文本保存到其他地方(针对不同的状态)。它使用一个普通的
ui标签
来最终显示它,因为这很方便,也很容易理解。设置该按钮的文本并不会在所有情况下更改按钮,这可能最终取决于绘图周期。我假设当它被绘制、布局或类似的东西时,它会在某个点上用另一个保存的变体“替换”标签的文本

现在,你可能想知道为什么苹果当时公开了UILabel,并因此使文本变得可编辑

遗留问题可能是这个决定的一个方面(IIRC)您可以用这种方式设置按钮的标题