iOS委托方法未调用

时间:2019-05-24 18:06:55

标签: ios appdelegate

我正在尝试使用委托首次实现控制器之间的通信。

我有一个FirstViewController,它会在几秒钟后启动FooTwoViewController,然后FooTwoViewController将一些字符串发回给调用Controller的

我已经实现了它,但是发现我的委托方法没有被调用,或者我实现不正确。

请在下面查看我的代码:

import UIKit

protocol FooTwoViewControllerDelegate:class {
    func myVCDidFinish(_ controller: FooTwoViewController, text: String)
}

class FirstViewController: UIViewController, FooTwoViewControllerDelegate  {

    var textRecieved = ""

    override func viewDidLoad() {
        super.viewDidLoad()

        // This launches FooTwoViewController after 2 seconds
        DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
            let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
            let secondViewController =
                storyBoard.instantiateViewController(withIdentifier: "FooTwoViewController") as! FooTwoViewController
            self.present(secondViewController, animated: true, completion: nil)
        }
    }

    func myVCDidFinish(_ controller: FooTwoViewController, text: String) {
        // THIS DOES NOT PRINT, WHAT AM I MISSING?
        print("Data received: \(text)")
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "mySegue" {
            let vc = segue.destination as! FooTwoViewController
            vc.delegate = self
        }
    }
}

下面的我的FooTwoViewController:

import UIKit

class FooTwoViewController: UIViewController {
    weak var delegate: FooTwoViewControllerDelegate?

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

    @IBAction func ClickMe(_ sender: Any) {
        delegate?.myVCDidFinish(self, text: "hey!") //assuming the delegate is assigned otherwise error
        self.dismiss(animated: true, completion: nil)
    }
}

我的myVCDidFinish方法没有被调用,请问我有什么遗漏吗?

2 个答案:

答案 0 :(得分:0)

您需要在此处设置delegate

let secondViewController =  storyBoard.instantiateViewController(withIdentifier: "FooTwoViewController") as! FooTwoViewController
secondViewController.delegate = self
self.present(secondViewController, animated: true, completion: nil)

因为prepare(for segue仅用performSegue来调用

self.performSegue(withIdentifier:"mySegue",sender:nil)

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "mySegue" {
        let vc = segue.destination as! FooTwoViewController
        vc.delegate = self
    }
}

答案 1 :(得分:0)

您实际上不是在执行segue。

代替:

DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
   let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
   let secondViewController = storyBoard.instantiateViewController(withIdentifier: "FooTwoViewController") as! FooTwoViewController
   self.present(secondViewController, animated: true, completion: nil)
}

替换为:

DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
    self.performSegue(withIdentifier: "mySegue", sender: self)
}

并确保界面开发器中已安装适当的序列。

相关问题