2014-12-01 1 views
1

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

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

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

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

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

protocol PurchaseDelegate { 
    func addToTotalAmount(product : Product) 
} 

В TableVC я объявил var delegate : PurchaseDelegate? = nil и в IBAction срабатывает от Segue: delegate?.addToTotalAmount(product)

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

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

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

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

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

+0

Похоже, эта проблема не соответствует шаблону делегата. Что делает третий viewController? –

+0

Третий viewController имеет ярлык с общей ценой, который должен быть обновлен, соответствующий продуктам, добавленным из вида коллекции, в представление таблицы. Более того, у него есть кнопки для инициирования оплаты/регистрации. – Simon

+0

Я думаю, что вы пытаетесь передать данные между ViewControllers, которые не соответствуют шаблону делегата. Проведите поиск «передачи данных между контроллерами представлений» - это, вероятно, то, что вы ищете. –

ответ

0

В конце концов я нашел решение проблемы после немного дальнейшего поиска с вдохновением от @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 
     } 
    } 
} 

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

+0

Я попытался сделать это так, но «self.actionVC» для меня ник. Но делегат базового вызова работает –