当ViewController(包含它)在后台时,'button.setImage'不起作用

时间:2019-04-25 10:01:09

标签: ios swift

我正在为基于CoreBluetooth的应用程序使用委托模式。我有一个主要的ViewController,它是BLEHandler类的委托。我正在根据从以下委托方法获得的响应来更新按钮:

    func acIsOn(error: NSError?) {
      if error == nil{
          pushButton.setImage(UIImage(named: "state4"), for: .normal)
      }
    }

当我的委托控制器类位于前台时,它工作正常,但是当我移至另一个ViewController并调用处理程序类的方法时,作为响应,该方法调用了上面的委托方法,图像上的按钮未更新。

这是我已经尝试过的:

  1. 将语句包装在DispatchQueue.main.async{}

  2. 呼叫pushButton.setNeedsLayout()setNeedsDisplay()

但是没有一个起作用。 ,

我还确保在ViewController不在前台时调用此方法。

编辑1:我对了解不允许这种情况发生的局限性更感兴趣,我不是在寻找技巧/技巧来绕过这种情况。

编辑2:如Shoazab所述,当VC在后台运行时,button.setBackgroundImage()可以工作。仍然好奇为什么button.setImage在后台不起作用,但是在VC位于顶部时却起作用。

3 个答案:

答案 0 :(得分:1)

您正在尝试更改ViewController上当前未显示的UI元素。它将更新值,但不会在UI上执行刷新。

我认为在ViewController的方法SetNeedsDisplay上调用viewWillAppear可以解决您的问题。 当控制器再次显示时,您还可以使用变量Image并更新按钮Image。

答案 1 :(得分:1)

将UI更新代码移动到viewWillAppear上,如下所示:

class MainViewController: UIViewController, BLEHandler {

 var isUIUpdateNeeded = false

 //Define your UI outlets or proeprties

 override func viewDidLoad() {
     super.viewDidLoad()

     // Do any additional setup after loading the view.
 }


 override func viewWillAppear(_ animated: Bool) {
     if isUIUpdateNeeded {
         updateUI()
     }
 }

 func acIsOn(error: NSError?) {
     if error == nil{
         pushButton.setImage(UIImage(named: "state4"), for: .normal)
     }
 }

 func updateUI() {
     //do your UI changes here
     pushButton.setImage(UIImage(named: "state4"), for: .normal)
 }

}

答案 2 :(得分:1)

调用btn.setBackgroundImage()它将对其进行设置

相关问题