【问题标题】:Swift Callback change UIViewController LabelSwift 回调更改 UIViewController 标签
【发布时间】:2015-05-12 09:11:46
【问题描述】:

我昨天开始为 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 函数,但标签不会改变。 有什么问题?

【问题讨论】:

    标签: ios swift callback


    【解决方案1】:

    在主线程中编写你的代码,它会像这样与 UI 交互:

    dispatch_async(dispatch_get_main_queue(), { () -> Void in
            if (result) {
                      resultLabel.text = "Login done"
          } else {
                  resultLabel.text = "Login wrong"
        }
    })
    

    【讨论】:

      【解决方案2】:

      您的 printResult 函数异步运行。

      所有 UI 更改都必须分派到主队列

      要返回主队列,请使用:

      dispatch_async(dispatch_get_main_queue(), ^{
          doneFunction(…)
      });
      

      在 POST 请求的完成块中

      【讨论】:

      • 太棒了!现在它起作用了。但是这样做的正确方法是什么?
      • 既然你是用异步函数来调度它的,这确实是要走的路。你也可以(正如 Krishna 建议的那样)将调度函数放在你的 doneFunction 中,这样你就只需要一次调度代码。
      猜你喜欢
      • 1970-01-01
      • 2014-12-23
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 2017-02-27
      • 2014-11-22
      • 1970-01-01
      相关资源
      最近更新 更多