【问题标题】:Delegate Method is not called in Swift?Swift 中没有调用委托方法?
【发布时间】:2015-08-03 09:01:36
【问题描述】:

我想在没有 segues 帮助的情况下将一个 Bool 值从视图控制器传递到另一个。所以我推荐并得到了代表。

我已在我的应用中应用了委托。但是没有调用 Delegate 方法。我不知道我在哪里犯了错误。

所以请帮帮我。

MainViewController

class MainViewController: UIViewController, WriteValueBackDelegate {

    @IBOutlet weak var LoginButton: UIButton!
    var LoggedInL :Bool?

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func writeValueBack(value: Bool) {
        println("Delegate Method")
        if (value == true){
            LoginButton.setTitle("My Profile", forState:UIControlState.Normal)
        }
    }

第二个视图控制器

class LoginController: UIViewController {

    @IBOutlet weak var LoginLabel: UILabel!
    @IBOutlet weak var email: UITextField!

    @IBOutlet weak var pwd: UITextField!
    var LoggedInL :Bool?

    var mydelegate: WriteValueBackDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func onSubmit(sender: AnyObject) {

         Alamofire.request(.GET, "http://www.jive.com/index.php/capp/user_verification/\(email.text)/\(pwd.text)")
            .responseJSON { (_, _, data, _) in

                println(data)
                let json = JSON(data!)
                let name = json["first_name"].stringValue
                let status = json["valid_status"].intValue
                println(status)
                var e = self.email.text
                println(e)
                self.LoginLabel.text = "Hey \(name)!"

                if status == 1{
                    println("Correect")
                     self.LoggedInL = true
                    self.mydelegate?.writeValueBack(true)

                }else {
                     self.LoggedInL = false
                    println("Error")
                }
        }
        navigationController!.popViewControllerAnimated(true)
    }
}

protocol WriteValueBackDelegate {
    func writeValueBack(value: Bool)
}

【问题讨论】:

  • 从 self.mydelegate?.writeValueBack(true) 更改为 self.mydelegate!.writeValueBack(true),如果应用程序崩溃,那么你没有初始化 self.mydelegate (:
  • 您是否尝试过 NSUserDefaults 将您的布尔值从一个视图传递到另一个视图?

标签: swift delegates swift-protocols


【解决方案1】:

您没有初始化委托,也没有必要,委托通常用于异步回调。改为这样做:

class MainViewController: UIViewController {

    static var sharedInstace : MainViewController?;
    @IBOutlet weak var LoginButton: UIButton!
    var LoggedInL :Bool?

    override func viewDidLoad() {
        super.viewDidLoad()
        MainViewController.sharedInstace = self; //this is better from init function
    }

    func writeValueBack(value: Bool) {
        println("Delegate Method")
        if (value == true){
            LoginButton.setTitle("My Profile", forState:UIControlState.Normal)
        }
    }
}

在登录视图控制器中

MainViewController.sharedInstance?.writeValueBack(true)

【讨论】:

    【解决方案2】:

    MainViewController中,您需要LoginController 实例的引用可能带有IBOutlet,然后在viewDidLoad 中设置委托

    @IBOutlet weak var loginController : LoginController!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        loginController.mydelegate = self
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 1970-01-01
      相关资源
      最近更新 更多