Ios web请求后调用UIButton时未更新

Ios web请求后调用UIButton时未更新,ios,swift,uibutton,Ios,Swift,Uibutton,我在web请求完成后调用了以下函数enableEndButton() func enableEndButton() { print("Start") buttonState = true go_button.setBackgroundImage(UIImage(named: "stop.png"), for: .normal) go_button.setTitle("Stop", for: .normal) print("Done") } 这两个打印输出

我在web请求完成后调用了以下函数
enableEndButton()

func enableEndButton() {
    print("Start")
    buttonState = true
    go_button.setBackgroundImage(UIImage(named: "stop.png"), for: .normal)
    go_button.setTitle("Stop", for: .normal)
    print("Done")
}
这两个打印输出,但直到我点击按钮,按钮才改变。我怎样才能让这种情况立即发生

正在从dataTask中调用此函数,如下所示:

let task = URLSession.shared.dataTask(with: url){
            data,response,error in
            if error != nil {
                print(error!)
            } else {
                weather_condition = self.parseWeatherJSON(weatherJSON: data!)
                //do something with weather_condition
                self.enableEndButton()
加上这一行

go_button.isEnabled = true
初始化按钮后立即调用
setbackgroundImage
setTitle

go_button = UIButton() 

// set enabled configuration
go_button.setBackgroundImage(UIImage(named: "stop.png"), for: .normal)
go_button.setTitle("Stop", for: .normal)

// set disabled configuration
go_button.setBackgroundImage(yourDisabled, for: .disabled)
go_button.setTitle(disabledTitle, for: .disabled)
加上这一行

go_button.isEnabled = true
初始化按钮后立即调用
setbackgroundImage
setTitle

go_button = UIButton() 

// set enabled configuration
go_button.setBackgroundImage(UIImage(named: "stop.png"), for: .normal)
go_button.setTitle("Stop", for: .normal)

// set disabled configuration
go_button.setBackgroundImage(yourDisabled, for: .disabled)
go_button.setTitle(disabledTitle, for: .disabled)

我要做的是总是将属性设置为nil或empty,然后更新它们。尝试下面的功能,希望它能正常工作

go_button.setBackgroundImage(nil, for: .normal)
go_button.setTitle("", for: .normal)

在函数的开头添加这两行。

我要做的是总是将属性设置为nil或empty,然后更新它们。尝试下面的功能,希望它能正常工作

go_button.setBackgroundImage(nil, for: .normal)
go_button.setTitle("", for: .normal)

在函数的开头添加这两行。

尝试将对enableEndButton的调用包装在发送的URLSession completion中

DispatchQueue.main.async {
    self.enableEndButton()
}
编辑:


为清晰起见,由于URLSessions在后台线程上运行,UI更新必须在主线程上完成,因此您需要将其显式分派到主线程,但不需要在主线程上运行日志语句。

尝试在分派中将对URLSession completion中enableEndButton的调用包装起来

DispatchQueue.main.async {
    self.enableEndButton()
}
编辑:



为了清楚起见,因为URLSessions在后台线程上运行,UI更新必须在主线程上完成,所以您需要将其显式地分派到主线程,但是不需要在主线程上运行日志语句。

我将这一行放在下面。setTitle,但它不会立即发生(即启动和完成打印机时)…需要10秒以上。有什么想法吗?为了响应您的编辑,我已经将它们初始化为特定的背景图像和标题,并且正在尝试在web请求完成后更改它们。您的按钮是否默认禁用,然后在请求完成后启用?否;我对它所做的唯一更改是更改背景图像和标题。您可以为禁用和正常状态设置
backgroundImage
title
。当您从禁用切换到启用时,它们将自动更新。我将这一行放在下面。setTitle但它不会立即发生(即启动和完成打印机时)…需要10秒钟以上。有什么想法吗?为了响应您的编辑,我已经将它们初始化为特定的背景图像和标题,并且正在尝试在web请求完成后更改它们。您的按钮是否默认禁用,然后在请求完成后启用?否;我对它所做的唯一更改是更改背景图像和标题。您可以为禁用和正常状态设置
backgroundImage
title
。当您从禁用切换到启用时,它们将自动更新。您在代码中的何处调用此方法?你能举个例子吗?它在匿名函数中,请求数据,解释JSON,然后直接处理数据->所有这些之后。你能给出一个代码示例吗?在诊断问题时会有帮助吗?您在代码中的何处调用此方法?你能举个例子吗?它在匿名函数中,请求数据,解释JSON,然后直接处理数据->所有这些之后。你能给出一个代码示例吗?这将有助于诊断问题否-按钮甚至没有设置为零。您使用的是故事板吗?在故事板中,您可以选择为不同类型设置不同的文本和图像。在情节提要中,检查属性和选定状态集图像和文本中的状态,并在函数中只写一行。yourButton.isSelected=true,并尝试将函数调用置于Dispatch中。否-按钮甚至没有设置为nil。您是否使用故事板?在故事板中,您可以选择为不同类型设置不同的文本和图像。在情节提要中,检查属性和选定状态集图像和文本中的状态,并在函数中只写一行。yourButton.isSelected=true,然后尝试将函数调用放入Dispatch。就这样。为什么消息会打印,而设置的属性不会打印?@Sam用更多的信息更新了答案,就是这样。为什么消息会打印,而设置的属性不会打印?@Sam更新了答案,提供了更多的信息