Метод делегата iOS не вызван - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь впервые установить связь между контроллерами, используя делегирование.

У меня есть FirstViewController, который запускает FooTwoViewController через несколько секунд, затем FooTwoViewController отправляет некоторую строку обратно в вызывающий контроллер.

Я реализовал это, но обнаружил, что мой метод делегата не вызывается ИЛИ Я неправильно его реализую.

Пожалуйста, смотрите мой код ниже:

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 голосов
/ 24 мая 2019

Вы на самом деле не выполняете переход.

Вместо:

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

И убедиться, что переход в Интерфейсном Разработчике установлен.

0 голосов
/ 24 мая 2019

Вам необходимо установить 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
    }
}
...