【问题标题】:Difference between setTitle:forState: and titleLabel.textsetTitle:forState: 和 titleLabel.text 之间的区别
【发布时间】:2015-04-08 14:12:47
【问题描述】:

查看互联网和其他 SO 问题后(这个问题很棒 iOS: UIButton titleLabel -- does it do anything at all?),我不清楚这两者之间有什么区别,更准确地说,这两者是如何工作的。

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

此时你可能会问:那有什么问题呢?

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

UITableViewCell - 我的视图 - 我的按钮

MyView 是 xib,通过界面生成器,我在其中设置按钮。当我设置按钮标题时:

self.myButton.titleLabel.text = @"Something"; // some string I get from server

它有效。但是,如果我在只包含 MyView 时尝试类似的方法(项目中的其他地方)并尝试:

myView.myButton.titleLabel.text = @"Something else";

它不起作用。让我更具体一点。在第二部分的一部分(即使在viewDidApper)按钮标题是我想要的。之后,按钮标签返回到它的 default 值。我在界面生成器中设置的那个。当我更改为

[myView.myButton setTitle:@"Something else" forState:UIControlStateNormal];

它按预期工作。

我想知道为什么会这样?我不清楚为什么标题会出现这种故障?这个奇怪的事情是否记录在某个地方(查看了苹果文档)?是否有可能实现 setTitle:forState:?

【问题讨论】:

    标签: ios objective-c uibutton


    【解决方案1】:

    我不确定 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 重绘按钮的实例当然不限于用户与按钮交互。它也可能由布局更改触发。

    【讨论】:

    • 内部是我想知道的,谢谢你的回答。
    【解决方案2】:

    您不应该使用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 不允许您设置文本)。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 是的,我知道我必须使用 forState 函数,但我的问题是为什么?为什么它以一种方式工作而不能解决?对于翻译,您可以使用已翻译的故事板并通过 ID 分配字符串(翻译时您已准备好一切,您只需设置文本)。谢谢你的回答。
      • @NickCatib 只是一个 UIButton 的东西,你需要根据 UIButton 的要求根据状态设置标题。
      • @Schemetrical ,您是否有一个链接实际上支持 UIButton 需要这种方法的论点?而且,如果是这样,为什么 button.titleLabel.text 在某些情况下完全有效?
      • @NickCatib 我实际上没有什么可以支持自己的,但是我从工作UIButtons 中知道,当我通过-setTitle:forState: 使用指定的设置器时,使用button.titleLabel.text 时的错误消失了。我假设没有状态,单独设置标题将绕过一些UIButton 内部代码。这只是我的猜测。
      • @Schemetrical 我同意,正如我在问题中所说的,我非常清楚我应该使用 set 来表示状态,我只是想知道为什么。这方面的信息似乎很少
      猜你喜欢
      • 2016-12-09
      • 1970-01-01
      • 2021-12-25
      • 2020-05-10
      • 2014-09-20
      • 2010-10-28
      • 2015-10-04
      • 2012-08-12
      • 2011-02-18
      相关资源
      最近更新 更多