2016-08-06 4 views
1

Я пытаюсь создать делегат протокола между двумя UICollectionViewController. с кодом, который у меня есть, я не получаю никаких ошибок или предупреждений, однако я не могу заставить делегата работать. Что мне не хватает?Swift 2 - Протокол Делегат между двумя UICollectionViewControllers

Вторая коллекция Просмотреть

public protocol LettersCollectionViewDelegate: class { 

     func DidSelectLetter(collectioView: UICollectionView,letter: Character, resultString:String) 

    } 

    class LettersCollectionView: UICollectionViewController { 

     // DELEGATE 
     weak var delegate: LettersCollectionViewDelegate? 

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

      let cell : UICollectionViewCell = collectionView.cellForItemAtIndexPath(indexPath)! as! LetterCellView 



      delegate?.DidSelectLetter(collectionView, letter: "T", resultString:"TestString") 

    } 

} 

Первая коллекция Просмотреть

class AnswerCollectionView: UICollectionViewController { 

    let lettersView = LettersCollectionView() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.lettersView.delegate = self 

    } 

} 

extension AnswerCollectionView: LettersCollectionViewDelegate { 

    func DidSelectLetter(collectioView: UICollectionView, letter: Character, resultString: String) { 

     print(letter) 
    } 
} 

UPDATE

enter image description here

+0

Вы создаете новый экземпляр LettersCollectionView в AnsweracollectionView и задаете делегат в этом экземпляре. Это не будет экземпляр, который находится на экране. Какова связь между этими двумя контроллерами представлений? Предоставляет ли кто-нибудь другой через segue? Являются ли они оба на экране через контроллеры контейнера? – Paulw11

+0

Спасибо .. Я попытался добавить делегата в свой основной ViewController, но все еще не получил делегата для работы – SNos

+0

Можете ли вы объяснить взаимосвязь между двумя контроллерами представления? Используете ли вы представления контейнера в своем основном контроллере? Почему вы использовали два uicollectionview, а не два контроллера uicollectionview? – Paulw11

ответ

1

Тебе нужен делегат быть экземпляром AnswerCollectionView, который встроен в ваш контроллер корневого представления. Аналогичным образом вам нужно установить делегат на экземпляр LettersCollectionView, который находится в корневом представлении. let lettersView = LettersCollectionView() создает новый экземпляр.

Вы можете получить требуемые ссылки в prepareForSegue в контроллере корневого представления. Вам нужно предоставить два записанных сегмента в ваших идентификаторах раскадровки, чтобы вы могли их идентифицировать.

class ViewController: UIViewController { 
    var lettersView: LettersCollectionView? 
    var answersView: AnswersCollectionView? 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "lettersSegue" { 
      let lettersView = segue.destinationViewController as? LettersCollectionView 
     } else if segue.identifier = "answersSegue" { 
      let answersView = segue.destinationViewController as? AnswersCollectionView 
     } 

     self.lettersView?.delegate = self.answersView 
} 
+0

Большое вам спасибо за ваш пример. Теперь я стараюсь следовать вашим советам по добавлению представлений коллекции без использования контейнера. Возможно, будет проще общаться между ними, если они инициализируются внутри контроллера вида. Я собираюсь принять ваш ответ за большую помощь, которую я получил от вас. Еще раз спасибо. Собираюсь попробовать ваш код. – SNos

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