iOS SDK:UIButton setTitleForState和UIButton titleLabel.text之间的区别

时间:2016-08-03 14:23:04

标签: ios objective-c cocoa-touch ios9

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

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

没有任何反应,按钮的文本与nib文件中定义的文本相同,但是如果我将实现更改为:

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

它按预期工作。

有人可以向我解释两种方法之间的区别吗?什么时候使用?

修改

建议的答案并不能解释我的情况,我测试了从另一个按钮更改按钮的文字这样的动作:

- (IBAction)otherButtonClicked:(id)sender {
self.testButton.titleLabel.text=@"Some Title";
}

并更改了按钮的文字。我只是想了解这种行为。

3 个答案:

答案 0 :(得分:2)

标题标签访问用于调整标签的其他属性,例如font,但设置titleLabel文字不起作用。

这是因为UIButton类有内部实现来根据按钮的不同状态设置文本,如selected/highlighted等覆盖标签文本。

答案 1 :(得分:2)

确切的答案是

titleLabel

  

请勿使用标签对象设置文本颜色或阴影颜色。相反,使用setTitleColor:forState:和setTitleShadowColor:forState:此类的方法来进行这些更改。

     

即使按钮没有,titleLabel属性也会返回一个值   已经显示了。 系统的属性值为nil   按钮

setTitle

  

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

     

至少应设置正常状态的值。如果一个   title没有为某个州指定,默认行为是使用   与UIControlStateNormal状态关联的标题。如果值为   未设置UIControlStateNormal,则属性默认为a   系统价值。

答案 2 :(得分:1)

接受的答案是正确的,我只是在这里添加一点(评论太短)

这里没有太多要解释的。标题根本不是意味着来设置文本 at all 。我的猜测是UIButton的内部工作方式使得它也可以将文本保存在其他地方(针对不同的状态)。它使用普通UILabel来最终显示,因为这很方便且易于理解。设置文本不会在所有情况下更改按钮,这可能最终取决于绘制周期。我假设当它被绘制,布局或类似时,它会在某个时刻“替换”标签的文本与其他保存的变体。

现在你可能想知道Apple为什么会暴露UILabel,因此似乎可以使文本可编辑。

遗产可能是这个决定的一个方面(IIRC你可以用这种方式设置按钮的标题)。虽然旧代码不会导致所需的行为,但它至少不会立即崩溃。此外,许多代码只是想获取文本并期望一个标签,它完全可以正常工作。

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

最终,它是Apple制作的设计选择。您无法直接设置标题文字,除了使用setTitle:forState:

之外,您不应该以任何方式执行此操作