SWIFT: передача данных из ViewController, где tableView определен, в tableViewCell

Я программно реализовал tableView внутри viewController:

class MoviesViewController5: UIViewController {
    let tableView = UITableView()
    
    
    // There's a code responsible for populating this array
    var moviesItemsArray = [[movieItem]]()
    var sectionsData:[[String:Any]]?

    let cellIdentifier = "movieCardCell"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
         tableView.register(sectionTableCell2.self, forCellReuseIdentifier: "tableViewCell")
        displayTableView2()
    }

    func displayTableView2() {
        self.view.addSubview(tableView)
        tableView.translatesAutoresizingMaskIntoConstraints = false

        tableView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        tableView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        tableView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
    }
}

extension MoviesViewController5: UITableViewDelegate, UITableViewDataSource {
     func tableView(_ tableView: UITableView, canFocusRowAt indexPath: IndexPath) -> Bool {
      return false
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 20
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell =
            tableView.dequeueReusableCell(withIdentifier: "tableViewCell", for: indexPath) as? sectionTableCell2
          else {
                fatalError("Unable to create explore table view cell")}
        return cell
    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 140
    }
}

TableViewCell также реализован программно:

class TableViewCell3: UITableViewCell {
    var moviesItems: [movieItem] = []
    let cellIdentifier = "movieCardCell"
    var collectionViewTest:UICollectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout())
    fileprivate let cellOffset: CGFloat = 50
    
    func setupCollectionView() {
        collectionViewTest.delegate = self
        // TODO: Should I communicate moviesItems to TableViewCell3 or set the dataSource to MoviesViewController 5
        collectionViewTest.dataSource = self
    }
}

// Trying to display only one collectionView in tableCell
extension TableViewCell3: UICollectionViewDelegate, UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return moviesItems.count
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier:
            cellIdentifier, for: indexPath) as! movieCardCell
        cell.movieImageView.sd_setImage(with: URL(string: moviesItems[indexPath.item].imageURL))
        return cell
    }
}

ЧТО Я ХОЧУ РЕАЛИЗОВАТЬ:

  1. Заселить moviesItemsArray внутри MoviesViewController5
  2. Общайтесь с каждым moviesItems из moviesItemsArray каждому корреспонденту TableViewCell3 на основе индекса
  3. Влияет на полученные данные фильма на свойство класса moviesItems из TableViewCell3
  4. Отобразите данные фильмов внутри TableViewCell3 с помощью collectionViewTest

ПРОБЛЕМА (ШАГ 2): я не знаю, как общаться с каждым moviesItems из moviesItemsArray каждому корреспонденту TableViewCell3на основе индекса.
ПРИМЕЧАНИЕ . Остальные шаги уже выполнены.


ВОПРОС: Должен ли я передавать данные, как любое сообщение между разными классами в SWIFT, ИЛИ есть что-то, что нужно сделать collectionViewTest.dataSource внутри TableViewCell3

2 ответа

Вопрос в том, как передать информацию в tableViewCell.

Что это cellForRowAtдля. Ваша реализация в настоящее время фактически пуста:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "tableViewCell", for: indexPath) as? sectionTableCell2
    else {
        fatalError("Unable to create explore table view cell")
    }
    // HERE, THIS IS WHERE YOU DO IT
    return cell
}

Только что нашел ответ в похожем проекте:

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if let _cell = tableView.dequeueReusableCell(withIdentifier: tableCellIdentifier, for: indexPath) as? CatalogueTableViewCell {
      // THIS
      _cell.images = images[indexPath.section]
      return _cell
    } else {
      return UITableViewCell()
    }
  }

Изображения - это свойство, которое используется для общения:

class CatalogueTableViewCell: UITableViewCell {

  internal var images: [UIImage]! 
    } 
Другие вопросы по тегам