iOS SDK:UIButton setTitleForState 和 UIButton 的区别titleLabel.text

iOS SDK: Difference between UIButton setTitleForState and UIButton titleLabel.text

我有一个自定义 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";
}

并且按钮的文本已更改。我只是想了解这种行为。

授予标题标签访问权限以调整标签的其他属性,例如 font,但设置 titleLabel 文本不起作用。

这是因为 UIButton class 有内部实现来根据按钮的不同状态设置文本,例如 selected/highlighted 等覆盖标签文本。

确切答案是

titleLabel

Do not use the label object to set the text color or the shadow color. Instead, use the setTitleColor:forState: and setTitleShadowColor:forState: methods of this class to make those changes.

The titleLabel property returns a value even if the button has not been displayed yet. The value of the property is nil for system buttons.

setTitle

Use this method to set the title for the button. The title you specify derives its formatting from the button’s associated label object. If you set both a title and an attributed title for the button, the button prefers the use of the attributed title over this one.

At a minimum, you should set the value for the normal state. If a title is not specified for a state, the default behavior is to use the title associated with the UIControlStateNormal state. If the value for UIControlStateNormal is not set, then the property defaults to a system value.

接受的答案是正确的,我在这里补充一下(评论太短)

这里就不多解释了。标题根本 根本 根本 没有设置文本。我的猜测是 UIButton 的内部工作原理使其也将文本保存在其他地方(针对不同的状态)。它使用普通的 UILabel 来最终显示它,因为它方便且易于理解。在所有情况下设置文本不会更改按钮,这可能最终取决于绘图周期。我假设当它被绘制、布局或类似的时候 "replaces" 标签的文本在某个时候与它的其他保存的变体。

现在您可能想知道为什么 Apple 然后公开了 UILabel 并因此似乎使文本当时可编辑。

遗产可能是这个决定的一个方面(IIRC,你曾经可以那样设置按钮的标题)。尽管旧代码不会产生预期的行为,但至少不会立即崩溃。此外,很多代码只是想获取文本并需要一个标签,它一如既往地工作得很好。

其次,完全不同的设计似乎有些矫枉过正。为了避免这种情况,他们将不得不使用 UILabel 的子类,这会阻止您设置文本或其他内容并使用它。或者完全跳过它(以及遗留支持),只提供 setTitle:forState: 方法。对于像标签这样的简单文本容器来说,这似乎有点过分了。

归根结底,这是苹果做出的设计选择。您不能直接设置标题文本,除了使用 setTitle:forState: