在浏览了互联网和其他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:?
答案 0 :(得分:2)
我不确定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"
因此需要使用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不允许您设置文本)。