SWIFT:从定义了tableView的ViewController向tableViewCell传输数据



我在viewController中以编程方式实现了一个tableView:

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. MoviesViewController5内填充moviesItemsArray
  2. 根据索引将moviesItemsArray中的每一个moviesItems与对应的TableViewCell3进行通信
  3. 将接收到的电影数据影响到TableViewCell3的类属性moviesItems
  4. 借助collectionViewTest显示TableViewCell3内部的电影数据

问题(步骤2(:我不知道如何根据索引将moviesItemsArray的每个moviesItems与每个对应的TableViewCell3进行通信
注意:其他步骤已经完成


问题:我应该像SWIFT中不同类别之间的任何通信一样通信数据,还是需要对TableViewCell3中的collectionViewTest.dataSource进行处理

问题是如何将信息传达给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]! 
} 

最新更新