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



在浏览了互联网和其他SO问题后(这是一个很棒的iOS:UIButton titleLabel——它能做什么吗?),我不清楚这两者之间的区别,更准确地说,这两者是如何工作的。

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

在这一点上,你可能会问:那么问题出在哪里呢?

我将通过例子来解释。我有以下层次结构:

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:?

我不确定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"

因此需要使用CCD_ 6以便将给定的标题与某个状态相关联。iOS重新绘制按钮的实例当然不限于用户与按钮的交互。它也可能由布局更改触发。

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

title Label属性的文档显示

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

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

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

我通常不会在界面生成器中设置按钮标题,而是在viewDidLoad中设置,并从Localizable.strings中获取标题。.

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

"不要使用标签对象来设置文本颜色或阴影颜色。而是使用此类的setTitleColor:forState:和setTitleShadowColor:forState方法来进行这些更改。"-源

最新更新