我有一个自定义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";
}
并更改了按钮的文字。我只是想了解这种行为。
答案 0 :(得分:2)
标题标签访问用于调整标签的其他属性,例如font
,但设置titleLabel
文字不起作用。
这是因为UIButton
类有内部实现来根据按钮的不同状态设置文本,如selected/highlighted
等覆盖标签文本。
答案 1 :(得分:2)
确切的答案是
请勿使用标签对象设置文本颜色或阴影颜色。相反,使用setTitleColor:forState:和setTitleShadowColor:forState:此类的方法来进行这些更改。
即使按钮没有,titleLabel属性也会返回一个值 已经显示了。 系统的属性值为nil 按钮强>
使用此方法设置按钮的标题。您指定的标题 从按钮的关联标签对象派生其格式。如果 你为按钮设置标题和属性标题, 按钮更喜欢使用属于此的属性。
至少应设置正常状态的值。如果一个 title没有为某个州指定,默认行为是使用 与UIControlStateNormal状态关联的标题。如果值为 未设置UIControlStateNormal,则属性默认为a 系统价值。
答案 2 :(得分:1)
接受的答案是正确的,我只是在这里添加一点(评论太短)
这里没有太多要解释的。标题根本不是意味着来设置文本 at all 。我的猜测是UIButton
的内部工作方式使得它也可以将文本保存在其他地方(针对不同的状态)。它使用普通UILabel
来最终显示,因为这很方便且易于理解。设置文本不会在所有情况下更改按钮,这可能最终取决于绘制周期。我假设当它被绘制,布局或类似时,它会在某个时刻“替换”标签的文本与其他保存的变体。
现在你可能想知道Apple为什么会暴露UILabel,因此似乎可以使文本可编辑。
遗产可能是这个决定的一个方面(IIRC你可以用这种方式设置按钮的标题)。虽然旧代码不会导致所需的行为,但它至少不会立即崩溃。此外,许多代码只是想获取文本并期望一个标签,它完全可以正常工作。
其次,设计它完全不同似乎有点矫枉过正。为了避免这种情况,他们必须使用UILabel的子类来阻止您设置文本或其他内容并使用它。或者完全跳过它(以及遗留支持),只提供setTitle:forState:
方法。对于像Label这样的简单文本容器来说,这似乎有点多了。
最终,它是Apple制作的设计选择。您无法直接设置标题文字,除了使用setTitle:forState: