setTitle:forState:和titleLabel.text之间的区别

时间:2015-04-08 14:12:47

标签: ios objective-c uibutton

在浏览了互联网和其他SO问题后(这个问题很棒iOS: UIButton titleLabel -- does it do anything at all?),我不清楚这两者之间有什么区别,更确切地说,这两者是如何工作的。

我知道setTitle:forState:让我为不同的状态设置按钮的文本(正常,禁用,突出显示等)。我也知道,titleLabel是只读的,但它的属性是可读/写的。

此时您可能会问:那么问题是什么?

我将通过示例解释它。我有以下等级:

  

UITableViewCell - MyView - MyButton

MyView是xib,通过界面构建​​器,我设置了按钮。当我设置按钮标题如:

self.myButton.titleLabel.text = @"Something"; // some string I get from server

有效。但是如果我在仅包含MyView(项目中的其他位置)时尝试类似的方法并尝试:

myView.myButton.titleLabel.text = @"Something else";

它不起作用。让我更具体一点。在第二部分的一部分(即使在viewDidApper)按钮标题是我想要的。之后,按钮标签将返回其默认值。我在界面构建器中设置的那个。当我改为

[myView.myButton setTitle:@"Something else" forState:UIControlStateNormal];

它按预期工作。

我想知道的是为什么会发生这种情况?我不清楚为什么这个故障与标题一起出现?这个奇怪的东西记录在哪里(查看苹果文档)?是否可以实现setTitle:forState:?

3 个答案:

答案 0 :(得分:2)

我不确定UIButton的内部是如何实际实现的,但这是猜测。有时iOS需要重绘按钮,即。点击该按钮以便按钮的状态发生变化(让我们说从UIControlStateNormalUIControlStateHighlighted)。然后,iOS会找到与UIControlStateHighlighted相关联的标题,然后使用类似的内容显示该文本。

myButton.titleLabel.text = @"Title for UIControlStateHighlighted";

示例场景:

[myButton setTitle:@"Normal" forState:UIControlStateNormal];
[myButton setTitle:@"Highlighted" forState:UIControlStateHighlighted];

// somewhere in the code, you call this to change the label
myButton.titleLabel.text = @"Something else";

// when user taps the button, iOS will do something like
myButton.titleLabel.text = @"Highlighted"; // will overwrite "Something Else"

// when user releases, iOS will again do something like
myButton.titleLabel.text = @"Normal"; // will overwrite "Highlighted"

因此需要使用setTitle:forState:才能将给定标题与特定状态相关联。 iOS重绘按钮的实例当然不限于用户与按钮交互。它也可以通过布局更改来触发。

答案 1 :(得分:0)

我通常不会在界面构建器中设置按钮标题,但是在viewDidLoad中设置按钮标题,并从Localizable.strings中获取标题..

您必须使用setTitle:forState和setTitleColor:forState来更改文本和颜色。所有其他标签属性都可以直接更改。

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

答案 2 :(得分:0)

您不应使用button.titleLabel.text =来设置按钮标题。

titleLabel属性的documentation

  

尽管此属性是只读的,但其自身的属性是读/写的。主要使用这些属性来配置按钮的文本。例如:

UIButton *button                  = [UIButton buttonWithType:UIButtonTypeSystem];
button.titleLabel.font            = [UIFont systemFontOfSize: 12];
button.titleLabel.lineBreakMode   = NSLineBreakByTruncatingTail;
     

请勿使用标签对象设置文本颜色或阴影颜色。而是使用此类的setTitleColor(:for :)和setTitleShadowColor(:for :)方法进行更改。 要设置标签的实际文本,请使用setTitle(_:for:)(button.titleLabel.text不允许您设置文本)。