быстрый делегат между двумя контроллерами представления без перехода

Мой протокол делегата никогда не вызывался

Мой первый контроллер - ViewController

class ViewController: UIViewController,testProtocol {

    @IBAction func btInit(sender: AnyObject) {
        println("Bt Init")

        let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let initViewController: UIViewController = storyBoard.instantiateViewControllerWithIdentifier("viewTarget") as targetViewController
        self.presentViewController(initViewController,animated: false, nil)

    }

    var targetController = targetViewController();

    override func viewDidLoad() {
        super.viewDidLoad()
        self.targetController.delegate = self
    }

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

    func testDelegate(){
        println(" in my view controller delegate ")
    }
}

В моем втором контроллере представления — targetViewController

protocol testProtocol {
    func testDelegate() // this function the first controllers
}

class targetViewController: UIViewController {

    @IBAction func BtTarget(sender: AnyObject) {

        println("bt target pressed")

        delegate?.testDelegate()
    }

    var delegate : testProtocol?

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

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

    func testDelegate(){
        println(" in my target view controller delegate ")
    }
}

Почему testDelegate() никогда не вызывается в ViewController? Что я делаю неправильно? Спасибо.

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


person user2718075    schedule 04.07.2015    source источник


Ответы (1)


Обычно вы устанавливаете свойство делегата нового контроллера представления в prepareForSegue:. Вы сказали, что не используете переход, поэтому вам нужно создать экземпляр второго контроллера представления и каким-то образом представить его. Вы можете сделать это, выполнив что-то вроде:

let storyboard = UIStoryboard(name: "AStoryboardName", bundle: nil)
let secondVC = storyboard.instantiateViewControllerWithIdentifier(anIdentifier) as! targetViewController
secondVC.delegate = self
presentViewController(secondVC, animated: true, completion: nil)

У вас есть метод testDelegate() в обоих контроллерах представления, но вы хотите использовать его только в первом контроллере представления. Затем ваш второй контроллер представления может вызвать delegate?.testDelegate() в нужное время.

Наконец, вы обычно хотите сделать свойства делегата слабыми, поэтому я бы рекомендовал изменить var delegate : testProtocol? на weak var delegate: testProtocol?.

Я бы почитал о делегировании. Вот относительно простой пятиэтапный процесс делегирования, который может вам помочь:

Делегирование за 5 шагов:

объект A является делегатом для объекта B, и объект B будет отправлять сообщения:

  1. Определите протокол делегата для объекта B.
  2. Дайте объекту B необязательную переменную делегата. Эта переменная должна быть слабой.
  3. Заставьте объект B отправлять сообщения своему делегату, когда происходит что-то интересное, например, когда пользователь нажимает кнопки «Отмена» или «Готово», или когда ему нужна информация.
  4. Сделать объект A соответствующим протоколу делегата. Он должен поместить имя протокола в строку своего класса и реализовать методы из протокола.
  5. Сообщите объекту B, что объект A теперь является его делегатом (в prepareForSegue(sender)).
person trevorj    schedule 04.07.2015
comment
@ user2718075 Отлично, рад это слышать! - person trevorj; 06.07.2015
comment
Привет! Во-первых, спасибо. Ваше объяснение великолепно. Но что, если между ними есть венчурный капитал? Например, VC1 представляет VC2, который представляет VC3. VC3 хотел бы, чтобы VC1 выполнил некоторую работу. Без перехода и программного вызова VC3, происходящего в VC2, как вы выполняете свой шаг № 5!?! - person Dave G; 03.12.2015