首页 > 解决方案 > 未调用 iOS 委托方法

问题描述

我第一次尝试使用委托实现控制器之间的通信。

我有一个 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 方法没有被调用,请问我遗漏了什么吗?

标签: iosappdelegate

解决方案


你需要在delegate这里设置

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

asprepare(for segue只用performSeguelike调用

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
    }
}

推荐阅读