Перейдите для просмотра контроллера из ячейки Tableview внутри коллекции. - PullRequest
0 голосов
/ 24 декабря 2018

Итак, у меня есть табличное представление, встроенное в коллекционное представление.У меня есть xib для просмотра таблицы.Когда пользователь выбирает ячейку табличного представления, я хочу перейти к другому контроллеру представления.

Я пробовал этот метод, но он не работает

let storyboardId = "Login"
        let vc = storyboard?.instantiateViewController(withIdentifier: storyboardId) 
        navigationController?.pushViewController(vc!, animated: true)

Но он не работает, потому что этот viewcontroller не добавлен встек навигации.

    class DetailCollectionViewCell: UICollectionViewCell, UITableViewDelegate,UITableViewDataSource {


    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

//        let navigationController = UINavigationController()
//        let storyboardId = "Login"
//        let vc = storyboard?.instantiateViewController(withIdentifier: storyboardId)
//        navigationController?.pushViewController(vc!, animated: true)


    }

}

Как мне решить эту проблему.Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018

Вы должны проверить некоторую информацию:

  • Во-первых: убедитесь, что navigationController равен нулю или нет
  • Во-вторых: проверьте, правильно ли выбран метод начального вида контроллера илинет, это мой путь:

    let storyboard = UIStoryboard (имя: "Main", bundle: nil)

    let viewController = storyboard.instantiateViewController (withIdentifier: "StoryboardIdentifier") как?ViewController

enter image description here

0 голосов
/ 26 декабря 2018

Эту проблему можно решить с помощью шаблона делегирования, выполнив следующие действия:

  • Подтвердите делегирование табличного представления для делегирования представления коллекции и представления собрания соответствующей контроллеру представления.
  • цепочка делегирования может быть использована для решения этой проблемы.В этом примере я показал, как можно передавать данные из ячейки табличного представления в ячейку представления сбора.
  • Реализация методов делегирования представления коллекции и источника данных.
  • Реализация методов делегата представления таблицы и источника данных.
  • всякий раз, когда выбранная строка выбирается, вызывается метод делегата вызова, чтобы сообщить контроллеру представления, что какая-то строка выбрана и в соответствии с изменением индекса строки обрабатывает вашу навигацию.

пример кода:

  • Шаг 1: Создать протокол.

    protocol RowSelected : class {
     func rowSelected(_ index : Int)
    }
    
  • Шаг 2: Объявить переменную делегата в TableViewCell.

    weak var delegate: RowSelected?
    
  • Шаг 3. В представлении коллекции подтвердите делегат и внедрите делегированный метод.

      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellIdentifier", for: indexPath) as! CollectionViewCell
      cell.delegate = self
      return cell
    
      extension CollectionViewCell : RowSelected {
         func rowSelected() {
          // Pass the information to view controller via a delegate/closure/notification. just like we passed information from table view cell to collection view cell and handle navigation accordingly.
         }
      }
    
  • Шаг 4. В ViewController вы можете подтвердить делегата для представления коллекции иреализовать его метод делегата и может обрабатывать навигацию.

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

0 голосов
/ 24 декабря 2018

У вас есть следующие опции

1) Реализовать источник данных табличного представления и delgate в viewController вместо ячейки представления коллекции
2) Использовать делегат (объяснено ниже)
3) Использовать замыкания
4)Использовать NotificationCenter

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

Вот простой пример (это не точный код, который вам может потребоваться изменить)

Создать протокол

protocol TableViewInsideCollectionViewDelegate:class {
    func cellTaped(data:IndexPath)
}

Внутри вашей ячейки коллекции добавить слабое свойство

weak var delegate:TableViewInsideCollectionViewDelegate?

Теперь в вашем классе ViewController вы в методе cellForItem коллекции viewview должны установить для делегата self

как

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "YourCell", for: indexPath) as! CustomCollectionCell
    cell.delegate = self
    return cell

и реализовать метод делегата в классе viewController и написать код для pushоттуда ваш контроллер представления выглядит как self.navigationController.push

Сейчас в Goto Collectionview Метод ячейки

и всякий раз, когда ваш tableviewDidSelect вызывал

, вызывал метод делегата, например self.delegate?.cellTaped(data: dataYouWantToPass)

Надеюсь, это полезно

...