在浏览了互联网和其他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需要重新绘制按钮,即点击按钮使按钮的状态发生变化(比如从UIControlStateNormal
到UIControlStateHighlighted
)。然后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方法来进行这些更改。"-源