Swift回调改变UIViewController标签
Swift Callback change UIViewController Label
我昨天开始研究 Swift IOS,我正在尝试制作一个简单的登录应用程序。这是我的 swift 文件
import Foundation
import SwiftHTTP
func printSomething (sentence: String) {
println(sentence);
}
func makeLoginCall(user: String, pwd: String, doneFunction : (Bool) -> Void) {
var url : String = "myurl"
var request = HTTPTask()
request.requestSerializer = JSONRequestSerializer()
request.responseSerializer = JSONResponseSerializer()
request.POST(url,
parameters : ["username": user, "password": pwd],
success: {(response: HTTPResponse) in
if let dict = response.responseObject as? Dictionary<String, AnyObject> {
println("\(dict)")
doneFunction(true)
}
}, failure: {(error: NSError, response: HTTPResponse?) in
println("error \(error)")
doneFunction(false)
})
}
这是我的 ViewController
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var userTextField: UITextField!
@IBOutlet weak var passTextField: UITextField!
@IBOutlet var resultLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func loginButtonCallback(sender: AnyObject) {
checkLogin()
}
func checkLogin() {
var user : String = userTextField.text
var pass : String = passTextField.text
makeLoginCall(user, pass, printResult)
}
func printResult(result: Bool) -> Void {
println("print result function started")
if (result) {
resultLabel.text = "Login done"
} else {
resultLabel.text = "Login wrong"
}
}
}
现在调用了 printResult 函数,但标签不会改变。
有什么问题吗?
您的 printResult
函数异步运行。
所有 UI 更改必须分派到主队列
返回主队列使用:
dispatch_async(dispatch_get_main_queue(), ^{
doneFunction(…)
});
在 POST 请求的完成块中
在将与 UI 交互的主线程中编写您的代码,如下所示:
dispatch_async(dispatch_get_main_queue(), { () -> Void in
if (result) {
resultLabel.text = "Login done"
} else {
resultLabel.text = "Login wrong"
}
})
我昨天开始研究 Swift IOS,我正在尝试制作一个简单的登录应用程序。这是我的 swift 文件
import Foundation
import SwiftHTTP
func printSomething (sentence: String) {
println(sentence);
}
func makeLoginCall(user: String, pwd: String, doneFunction : (Bool) -> Void) {
var url : String = "myurl"
var request = HTTPTask()
request.requestSerializer = JSONRequestSerializer()
request.responseSerializer = JSONResponseSerializer()
request.POST(url,
parameters : ["username": user, "password": pwd],
success: {(response: HTTPResponse) in
if let dict = response.responseObject as? Dictionary<String, AnyObject> {
println("\(dict)")
doneFunction(true)
}
}, failure: {(error: NSError, response: HTTPResponse?) in
println("error \(error)")
doneFunction(false)
})
}
这是我的 ViewController
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var userTextField: UITextField!
@IBOutlet weak var passTextField: UITextField!
@IBOutlet var resultLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func loginButtonCallback(sender: AnyObject) {
checkLogin()
}
func checkLogin() {
var user : String = userTextField.text
var pass : String = passTextField.text
makeLoginCall(user, pass, printResult)
}
func printResult(result: Bool) -> Void {
println("print result function started")
if (result) {
resultLabel.text = "Login done"
} else {
resultLabel.text = "Login wrong"
}
}
}
现在调用了 printResult 函数,但标签不会改变。 有什么问题吗?
您的 printResult
函数异步运行。
所有 UI 更改必须分派到主队列
返回主队列使用:
dispatch_async(dispatch_get_main_queue(), ^{
doneFunction(…)
});
在 POST 请求的完成块中
在将与 UI 交互的主线程中编写您的代码,如下所示:
dispatch_async(dispatch_get_main_queue(), { () -> Void in
if (result) {
resultLabel.text = "Login done"
} else {
resultLabel.text = "Login wrong"
}
})