【问题标题】:is it possible to update UIButton title/text programmatically?是否可以以编程方式更新 UIButton 标题/文本?
【发布时间】:2010-11-05 05:56:39
【问题描述】:

我有一个UIButton,当按下它时,会显示一个新视图,用户可以在其中更改一些设置。当视图被关闭时,我想更新 UIButton 的标题/文本以反映新状态。我在打电话:

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];
[myButton setTitle: @"myTitle" forState: UIControlStateApplication];
[myButton setTitle: @"myTitle" forState: UIControlStateHighlighted];
[myButton setTitle: @"myTitle" forState: UIControlStateReserved];
[myButton setTitle: @"myTitle" forState: UIControlStateSelected];
[myButton setTitle: @"myTitle" forState: UIControlStateDisabled];

但它似乎永远不会改变 IB 中指定的原始文本/标题。

【问题讨论】:

  • 您确定正在调用发布的代码吗?您是否放置了 BREAKPOINT 来证明这一点?你能张贴你的代表的签名吗?
  • 顺便说一句,我相信您可以一次引用多个控件状态: [ myButton setTitle:@"myTitle" forState:( UIControlStateNormal | UIControlStateApplication | UIControlStateHighlighted | ... ) ];请注意按位 OR 运算符的使用,而不是逻辑 OR 运算符 (||)。通常,当您处理这样的状态时,您可以将它们与 |操作员。如果我大错特错,请有人纠正我。 :)
  • 我希望他们有一个像 UIControlStateAll :D
  • 按位组合在 iOS5 中似乎对我不起作用。
  • 这里有同样的问题。在 iOS5 上,按位组合对我不起作用。 /CC @LucasTizma

标签: ios iphone uibutton uicontrolstate


【解决方案1】:

您是否在视图控制器类中将按钮指定为 IBOutlet,并且它是否作为 Interface Builder 中的插座正确连接(从新的引用插座 ctrl 拖动到文件所有者并选择您的 UIButton 对象)?当我看到这些症状时,这通常是我遇到的问题。


编辑:虽然这里不是这种情况,但如果您为按钮设置属性标题,然后您尝试更改标题而不是属性标题,也会发生类似的情况。

【讨论】:

  • 宾果游戏,就是这样,谢谢。我真的希望 Objective-C 在这种情况下只抛出 NullPointerException,而不是默默地假装可以向 nil 对象发送消息。这几乎每天都在咬我……呃!
  • ObjC 不会“假装”可以向 nil 发送消息,因为它可以向 nil 发送消息...
  • 这里的问题不是空指针。问题是 IB 设置了一个 UIButton 实例,该实例在代码中没有被正确引用(通过 IBOutlet),因此它永远无法以编程方式进行操作。
【解决方案2】:

我只为 UIControlStateNormal 设置了 title 参数就解决了这个问题,它自动适用于其他状态。问题似乎出在您设置另一个 UIControlState 时。

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];

【讨论】:

    【解决方案3】:

    尽管 Caffeine Coma 的问题已解决,但我想提供另一个导致标题未显示在 UIButton 上的潜在原因。

    如果您使用为 UIButton 设置图像

    - (void)setImage:(UIImage *)image forState:(UIControlState)state
    

    它可以覆盖标题。我发现这很困难,并且想象你们中的一些人最终会出于同样的原因阅读此页面。

    改用这个方法

    - (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state
    

    按钮图片和标题不受影响。

    我使用以编程方式创建的按钮和在 .xib 中创建的按钮对此进行了测试

    【讨论】:

      【解决方案4】:

      我发现了另一个问题。这可能是 iOS 5 中引入的一个错误,但我想我会为遇到它的其他人指出它。

      如果您没有为 XIB 中的按钮设置任何默认文本,则如果您以编程方式设置它,则不会出现任何文本。如果您确实在 XIB 中设置了文本,那么您随后以编程方式分配给按钮的任何文本都将被截断为默认文本的大小。

      最后,如果您使用按钮显示视图,然后调用另一个视图(如 ActionSheet)然后关闭它,您以编程方式分配给按钮的文本将被删除,按钮标题将返回无论您在 XIB 中设置什么。

      【讨论】:

      • 这三种行为我都注意到了,这确实很烦人。
      • 我遇到了截断问题(以编程方式将文本更改为更长的内容),因此我在文本末尾添加了额外的空格,以便在将文本更改为更长的单词时“保留”该空间.这对我有用。
      • 看来解决方法是使用方法 [_button setTitle: @"title" forState: UIControlStateNormal];而不是直接访问 _button.titleLabel.text 属性。坚持方法调用,你可能会得到你想要的。
      【解决方案5】:

      还有一个可能的原因是:

      如果您尝试在(id)initWithNibName: ... 方法中设置按钮的标题,那么您的按钮属性仍然为零。它尚未分配给 UIButton。

      您必须确保您正在使用(void)viewWillLoad(void)viewWillAppear 之类的方法设置按钮,但您可能不想将它们设置为(void)viewDidAppear

      【讨论】:

        【解决方案6】:

        确保你在主线程上。

        如果没有,它仍然会保存按钮文本。当您在调试器中检查对象时,它将在那里。但它实际上不会更新视图。

        【讨论】:

          【解决方案7】:

          我一直遇到这个问题,唯一的解决方案是将图像和标签作为子视图添加到 uibutton。然后我发现主要问题是我使用的 UIButton 标题为:Attributed。当我将其更改为 Plain 时,只需设置 titleLabel.text 就可以了!

          【讨论】:

            【解决方案8】:

            有时它会变得非常复杂。简单的方法是“刷新”按钮视图!

            //Do stuff to your button here.  For example:
            
            [mybutton setEnabled:YES];
            
            //Refresh it to new state.
            
            [mybutton setNeedsDisplay];
            

            【讨论】:

              【解决方案9】:

              @funroll 是绝对正确的。在这里你可以看到你需要什么Make sure function runs on main thread only。如果您不想处理线程,您可以这样做,例如:创建 NSUserDefaults 并在 ViewDidLoad 中检查条件是否按下了另一个视图中的按钮(在另一个视图中设置为 NSUserDefaults 所需的信息),并取决于设置的条件所需的标题你的 UIButton,所以 [yourButton setTitle: @"Title" forState: UIControlStateNormal];

              【讨论】:

              • 这对我来说非常有用。事实证明,如果您从后台线程调用 setTitle 和 setNeedsDisplay,则视图将在更晚更新。
              【解决方案10】:

              原来文档告诉你答案!如果 UIButton 已经有要使用的属性字符串(似乎是使用 Xcode 界面生成器时获得的默认值),则 UIButton 将忽略标题更改。

              我使用了以下内容:

              [self.loginButton 
                   setAttributedTitle:[[NSAttributedString alloc] initWithString:@"Error !!!" attributes:nil] 
                   forState:UIControlStateDisabled];
              [self.loginButton setEnabled:NO];
              

              【讨论】:

                【解决方案11】:

                从 Swift 4 开始:

                    button.setTitle("Click", for: .normal)
                

                【讨论】:

                  【解决方案12】:

                  快速:

                  button.setTitle("Swift", forState: UIControlState.Normal)                   
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2014-11-07
                    • 1970-01-01
                    • 2014-12-07
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-10-15
                    • 1970-01-01
                    相关资源
                    最近更新 更多