【问题标题】:How to change UIButton label programmatically如何以编程方式更改 UIButton 标签
【发布时间】:2015-10-15 11:15:47
【问题描述】:

当我第一次运行我的应用程序时,我从服务器检索了一个数字并将其显示在我的 UIButton 标签中。将此视为红色 UIButton 上显示的通知编号。

当我在应用程序中删除通知时,我希望我的 UIButton 标签减 1。我可以在删除通知后从服务器获取减量后的数字,但我无法在 UIButton 上显示这个新数字.首次触发应用时,该按钮始终显示数字。

我在删除通知以更新 UIButton 后调用 makeButtonView() 方法

func makeButtonView(){
    var button = makeButton()
    view.addSubView(button)

    button.tag = 2
    if (view.viewWithTag(2) != nil) {
        view.viewWithTag(2)?.removeFromSuperview()
        var updatedButton = makeButton()
        view.addSubview(updatedButton)
    }else{
        println("No button found with tag 2")
    }


}

func makeButton() -> UIButton{
 let button = UIButton(frame: CGRectMake(50, 5, 60, 40))
 button.setBackgroundImage(UIImage(named: "redBubbleButton"), forState: .Normal)
    API.getNotificationCount(userID) {
        data, error in

        button.setTitle("\(data)", forState: UIControlState.Normal)

    }
    button.addTarget(self, action: "targetController:", forControlEvents: UIControlEvents.TouchUpInside)

    return button

}

【问题讨论】:

  • 我看不到从视图中添加/删除按钮并创建两次按钮的意义。无论如何,updatedNotificationButton 是什么? var updatedButton = makeButton() view.addSubview(updatedNotificationButton)
  • 我这样做是因为标签没有重置为新数字。它总是相同的数字。我以为我需要杀死按钮并重新创建它,但这也无济于事。我修复了你指出的代码。

标签: ios xcode swift uibutton


【解决方案1】:

将此代码用于 Swift 4 或 5

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

【讨论】:

    【解决方案2】:

    我需要更多信息才能为您提供正确的代码。但是这种方法应该可行:

    lazy var button : UIButton = {
        let button = UIButton(frame: CGRectMake(50, 5, 60, 40))
        button.setBackgroundImage(UIImage(named: "redBubbleButton"), forState: .Normal)
        button.addTarget(self, action: "targetController:", forControlEvents: UIControlEvents.TouchUpInside)
    
        return button
        }()
    
    func makeButtonView(){
        // This should be called just once!!
        // Likely you should call this method from viewDidLoad()
        self.view.addSubview(button)
    }
    
    func updateButton(){
        API.getNotificationCount(userID) {
            data, error in
            // be sure this is call in the main thread!!
            button.setTitle("\(data)", forState: UIControlState.Normal)
        }
    }
    

    【讨论】:

    • 它没有用。它就像以前一样工作。按钮标签编号没有减少。但是删除通知后可以看到服务器返回的号码。
    • 只是让您知道我删除了不同页面中的通知。然后我关闭通知页面。按钮和通知不在同一个故事板上。
    • 故事板?对不起,但这没有任何意义。您是使用情节提要还是以编程方式创建按钮?
    • 红色通知按钮和通知视图——我删除通知的地方——是同一个应用程序的两个不同部分。当我第一次运行应用程序时,我点击通知按钮,通知视图出现。我删除了一个通知,关闭了页面,我看到红色按钮标签没有改变。
    • 是的,我正在以编程方式创建按钮。对不起,我应该说故事板,他们不在同一个视图上。
    【解决方案3】:

    自 Swift 4 以来有一些更新。这对我有用:

    self.button.setTitle("按钮标题", for: UIControl.State.init(rawValue: 0))

    将按钮替换为您的 IBOutlet 名称。您还可以使用变量或数组来代替引用的文本。

    【讨论】:

      【解决方案4】:

      这很简单......

      import UIKit
      
      class ViewController: UIViewController {
      
          @IBOutlet var button: UIButton!
      
          override func viewDidLoad() {
              super.viewDidLoad()
      
              button.setTitle("hello world", forState: UIControlState.Normal)
          }
      }
      

      我相信如果您将状态设置为正常,只要您没有为这些状态明确设置标题,默认情况下该值就会传播到其他状态。

      换个说法,如果设置为normal,按钮进入附加状态时也应该显示这个标题

      UIControlState.allZeros
      UIControlState.Application
      UIControlState.Disabled
      UIControlState.Highlighted
      UIControlState.Reserved
      UIControlState.Selected
      

      最后,这里是Apple's documentation,以防您有其他问题。

      【讨论】:

      • 我正在以编程方式创建按钮,为什么我需要一个插座?按钮不会重置标题。
      • 顺便说一句,我在设置标题时看不出你的代码和我的代码有什么不同。
      【解决方案5】:

      由于您的 API 调用应该在后台线程上运行,您需要将 UI 更新分派回主线程,如下所示:

      DispatchQueue.main.async {
            button.setTitle(“new value”, forState: .normal)
        }
      

      【讨论】:

        【解决方案6】:

        设置标题后,只需简单重绘按钮即可:

        button.setNeedsDisplay();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-11-07
          • 1970-01-01
          • 2011-12-27
          • 2018-04-28
          • 1970-01-01
          • 1970-01-01
          • 2015-02-27
          • 2017-08-14
          相关资源
          最近更新 更多