2016-10-29 4 views
0

Вот код с процессом делегата предложил ...Вызов функции в контроллере представления из другого контроллера представления

в главном контроллере представления ...

protocol FilterDelegate: class { 
    func onRedFilter() 
    func onGreenFilter() 
    func onBlueFilter() 
    func onUnfiltered() 
} 

class ViewController: UIViewController, FilterDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

---- 

// Increase red color level on image by one. 
    func onRedFilter() { 

    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

     if segue.identifier == "filterSegue" { 

      let dest = segue.destinationViewController as! CollectionViewController 
      dest.filterDelegate = self 

     } 
    } 

в виде коллекции контроллере .. .

var filterDelegate: FilterDelegate? 

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 

    print("Cell \(indexPath.row) selected") 

    guard let filterDelegate = filterDelegate else { 
     print("Filter delegate wasn't set!") 
     return 
     } 

    switch indexPath.row { 

     case 0: 
      filterDelegate.onRedFilter() 
     case 1: 
      filterDelegate.onGreenFilter() 
     case 2: 
      filterDelegate.onBlueFilter() 
     case 3: 
      filterDelegate.onUnfiltered() 
     default: 
      print("No available filter.") 

    } 

Прямо сейчас ... код останавливается в защитном блоке и печатает сообщение об ошибке. Блок переключателя не выполняется при любом нажатии ячейки.

ответ

0

Ваша теория в вашем втором последнем предложении верна - когда вы вызываете storyboard.instantiateViewControllerWithIdentifier в «дочерний» контроллер просмотра, вы на самом деле создаете совершенно новый экземпляр вашего основного контроллера представлений. Вы являетесь , а не, ссылаясь на существующий контроллер основного вида, поэтому методы, которые вы вызываете, не оказывают никакого эффекта.

Существует несколько способов добиться того, что вы пытаетесь сделать, включая delegate pattern или с помощью закрытий. Вот набросок того, что она может выглядеть следующим образом, используя протокол делегата:

protocol FilterDelegate: class { 
    func onRedFilter() 
    func onGreenFilter() 
    func onBlueFilter() 
    func onUnfiltered() 
} 

class MainViewController: UIViewController, FilterDelegate { 

    // implement these as required 
    func onRedFilter() { } 
    func onGreenFilter() { } 
    func onBlueFilter() { } 
    func onUnfiltered() { } 

    // when we segue to the child view controller, we need to give it a reference 
    // to the *existing* main view controller 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let dest = segue.destination as? ChildViewController { 
      dest.filterDelegate = self 
     } 
    } 

} 

class ChildViewController: UIViewController { 

    var filterDelegate: FilterDelegate? 

    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 

     // ... 

     guard let filterDelegate = filterDelegate else { 
      print("Filter delegate wasn't set!") 
      return 
     } 

     switch indexPath.row { 
      case 0: 
       filterDelegate.onRedFilter() 
      case 1: 
       filterDelegate.onGreenFilter() 
      case 2: 
       filterDelegate.onBlueFilter() 
      case 3: 
       filterDelegate.onUnfiltered() 
      default: 
       print("No available filter.") 

     } 

    } 

} 

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

+0

Я пробовал это, и не только ячейки не вызывают фильтры (даже не встроенные операторы печати, которые печатают работу indexPath.row), но теперь горизонтальная прокрутка контроллера коллекции нарушена. Есть идеи? –

+0

Похоже, что что-то перепуталось с контроллером дочернего представления, а методы UICollectionViewDataSource не работают. Не видя кода, трудно сказать, что происходит. Думаю, я бы удостоверился, что он все еще подклассифицирует UICollectionViewController (не UIViewController) и убедитесь, что источник данных по-прежнему правильно подключен в раскадровке. –

+0

Ну, мне удалось вернуть его, поэтому просмотр коллекции прокрутки работает. Можете ли вы объяснить мне, что делает блок с охранником и что-то отсутствует? В настоящее время его печать «Делегат фильтра не был установлен!» оператор на каждой ячейке нажимает на меню прокрутки и возвращается, никогда не попадая в оператор switch. –

Смежные вопросы