我正在为基于CoreBluetooth的应用程序使用委托模式。我有一个主要的ViewController,它是BLEHandler类的委托。我正在根据从以下委托方法获得的响应来更新按钮:
func acIsOn(error: NSError?) {
if error == nil{
pushButton.setImage(UIImage(named: "state4"), for: .normal)
}
}
当我的委托控制器类位于前台时,它工作正常,但是当我移至另一个ViewController并调用处理程序类的方法时,作为响应,该方法调用了上面的委托方法,图像上的按钮未更新。
这是我已经尝试过的:
将语句包装在DispatchQueue.main.async{}
呼叫pushButton.setNeedsLayout()
和setNeedsDisplay()
但是没有一个起作用。 ,
我还确保在ViewController不在前台时调用此方法。
编辑1:我对了解不允许这种情况发生的局限性更感兴趣,我不是在寻找技巧/技巧来绕过这种情况。
编辑2:如Shoazab所述,当VC在后台运行时,button.setBackgroundImage()可以工作。仍然好奇为什么button.setImage在后台不起作用,但是在VC位于顶部时却起作用。
答案 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()它将对其进行设置