SWIFT:从定义 tableView 到 tableViewCell 的 ViewController 通信数据
Posted
技术标签:
【中文标题】SWIFT:从定义 tableView 到 tableViewCell 的 ViewController 通信数据【英文标题】:SWIFT: Communicating data from ViewController where tableView is defined to tableViewCell 【发布时间】:2020-10-05 14:41:47 【问题描述】:我已经在 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
我要实现的内容:
-
在
MoviesViewController5
中填充moviesItemsArray
根据索引将moviesItemsArray
中的每个moviesItems
与每个对应的TableViewCell3
通信
将接收到的电影数据影响到TableViewCell3
的类属性moviesItems
在collectionViewTest
的帮助下显示TableViewCell3
中的电影数据
问题(第 2 步):我不知道如何根据索引将 moviesItemsArray
中的每个 moviesItems
传达给每个对应的 TableViewCell3
。注意: 其他步骤已经完成。
问题:我是否应该像在 SWIFT 中的不同类之间进行任何通信一样通信数据,或者需要在 TableViewCell3
中使用 collectionViewTest.dataSource
完成某些事情
【问题讨论】:
请一次只问一个问题。从简单开始... 如果您解决问题以便只问第一个问题,您可能会自己找到答案。至少,您可以发布一个独立的问题。 问题是如何将信息传达给 tableViewCell。我只是想提供两种我想过的方法(这是不必要的,我可以问一个问题:我该怎么做) 【参考方案1】:问题是如何将信息传达给 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
【讨论】:
【参考方案2】:刚刚在一个类似的项目中找到了答案:
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()
Images 是用于通信的属性:
class CatalogueTableViewCell: UITableViewCell
internal var images: [UIImage]!
【讨论】:
和我的回答一样。 @matt 您没有提供详细信息以上是关于SWIFT:从定义 tableView 到 tableViewCell 的 ViewController 通信数据的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3:Tableview 选择行转到不同的导航视图
Swift UITableView 删除行项 - tableview 数据源是 Core Data
将数据从 TableView 发送到 DetailView Swift