Как перейти от ячейки встроенного представления коллекции к другому контроллеру представления без использования раскадровки или IB? - PullRequest
0 голосов
/ 14 сентября 2018

О приложении (UICollectionView в UICollectionView):

  • TabBarController - корневой контроллер окна приложения
  • TabBarController содержит 3 контроллера навигации.
  • 1-й навигационный контроллер имеет HomeViewController в качестве корневого контроллера
  • HomeViewController содержит CategoryCollectionView
  • Внутри каждой ячейки CategoryCollectionView присутствует один ItemCollectionView
  • Каждый ItemCollectionView содержит множество ItemCell

Цель : когда пользователь нажимает ItemCell, приложение должно перейти к другому контроллеру представления, ItemViewController. Я разрабатываю это приложение полностью с использованием кода. Так что я хочу сделать это без Storyboard Segues или IB. Я до сих пор не смог понять это. Если бы вы могли указать мне правильное направление, это было бы здорово. Спасибо.

Я попробовал следующее, но они не сработали:

Первый метод : доступ к корневому контроллеру окна из ячейки CategoryCollectionView

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let currentNavCon = self.window?.rootViewController!.navigationController
    currentNavCon?.pushViewController(ItemViewController(), animated: true)
}

Второй метод : я определил функцию itemCellClicked в HomeViewController и вызвал ее из didSelectItemAt ячейки CategoryCollectionView.

func itemCellClicked(_ sender: CatalogViewCategoryCell, _ position: Int) {
    let itemViewController = ItemViewController()
    navigationController?.pushViewController(itemViewController, animated: true)
}

А внутри клетки:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    HomeViewController().itemCellClicked(self, indexPath.item)
}

1 Ответ

0 голосов
/ 14 сентября 2018

Выдвижение контроллера вида из ячейки никогда не является хорошей идеей.Вам необходимо распространить событие клика от ItemCell до HomeViewControlller.
В вашем CategoryCollectionView определить открытое свойство типа closure.

var onDidSelectItem: ((IndexPath) -> ())?

Теперь в CategoryCollectionViewdidSelectItem, вызовите замыкание вот так.

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        self.onDidSelectItem?(indexPath)
}

В вашем HomeViewControlller cellForRow получите обратный вызов.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    categoryCollectionView.onDidSelectItem = {(indexPath) in
       //item at indexPath clicked, do whatever you want to do with it.
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...