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

Я пытаюсь создать приложение, которое использует три контейнера для отображения разного контента, но у меня возникают проблемы со связью между контейнерами. Мне удалось использовать переход для отправки некоторой информации по нажатию кнопки в одном контейнере в другой контейнер, но часть этой информации также должна быть передана в третий контейнер. Для этого я хотел использовать делегат, но я не могу ссылаться на правильный ViewController на переменную делегата.

Итак, что я хочу, выглядит следующим образом:

  1. Нажатие CollectionViewCell вызывает переход к TableVC
  2. TableVC получает информацию и обновляет таблицу
  3. TableVC запускает функцию делегата в третьем VC
  4. Третий венчурный капитал получает некоторую информацию и обновляет представление

В приведенном выше мне удалось заставить работать 1 и 2, но застрял на 3.

Я сделал свой протокол следующим образом:

protocol PurchaseDelegate {
    func addToTotalAmount(product : Product)
}

В TableVC я объявил var delegate : PurchaseDelegate? = nil и в IBAction, запущенном из перехода: delegate?.addToTotalAmount(product)

В третьем VC я реализовал делегат следующим образом:

class thirdVC:UIViewController,PurchaseDelegate {
    func addToTotalAmount(product : Product) {
        println("Adding....")
    }
}

Все три контейнера находятся внутри основного VC, который выполняет некоторые начальные действия в приложении.

Моя проблема в том, что я не знаю, как получить ссылку из третьего VC на мою переменную делегата в моем tableVC.

Заранее спасибо.


person Simon    schedule 01.12.2014    source источник
comment
Похоже, эта проблема не соответствует шаблону делегата. Что делает третий viewController?   -  person Anna Dickinson    schedule 02.12.2014
comment
Третий viewController имеет метку с общей ценой, которую необходимо обновить в соответствии с продуктами, добавленными из представления коллекции в представление таблицы. Кроме того, он имеет кнопки для инициирования оплаты/регистрации.   -  person Simon    schedule 02.12.2014
comment
Я думаю, что вы пытаетесь передать данные между ViewControllers, что не соответствует шаблону делегата. Выполните поиск для передачи данных между контроллерами представления - это, вероятно, то, что вы ищете.   -  person Anna Dickinson    schedule 02.12.2014


Ответы (1)


В итоге я нашел решение проблемы после небольшого поиска, вдохновленного @Anna Dickinson.

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

Затем в контроллере основного представления — контроллере представления для представления с контейнерами — реализуется функция prepareForSegue, так как она будет срабатывать по мере инициализации контейнеров.

Весь этот код остается таким же, как и выше, но контроллер основного представления будет выглядеть примерно так:

class MainViewController: UIViewController {
    var actionVC : FirstViewController! // This is the one, that implements the delegate protocol
    var tableVC : SecondViewController! // This is the one, that has a delegate variable
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if(segue.identifier == "firstVC"){
            self.actionVC = segue.destinationViewController as FirstViewController
        } else if(segue.identifier == "secondVC"){
            self.tableVC = segue.destinationViewController as SecondViewController
            self.tableVC.delegate = self.actionVC
        }
    }
}

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

person Simon    schedule 03.12.2014
comment
Я пытался установить так, но self.actionVC для меня нулевой. Но делегат базового вызова работает - person Vineesh TP; 26.05.2016