使用字典值在 tableView 内填充 collectionView 的标签
Posted
技术标签:
【中文标题】使用字典值在 tableView 内填充 collectionView 的标签【英文标题】:Using dictionary values to populate collectionView's label inside of a tableView 【发布时间】:2018-06-25 12:41:14 【问题描述】:所以我在tableView
中有一个collectionView
。我想使用我的数组中的值来填充每个collectionViewCell
中的每个标签文本。如果我在collectionView
cellForItemAt
中打印下面的代码,我会得到下面的(见图)(显然索引超出范围):
Print(array[indexPath.row].details.values)
所以使用照片中的示例,我怎样才能得到以下信息:
外表ViewCell (1) 集合视图单元格 (1) 标签 - “1” 集合视图单元格 (2) 标签 - “3” 集合视图单元格 (3) 标签 - “5” 外表ViewCell (2) 集合视图单元格 (1) 标签 - “7”你也可能注意到它的数组没有按顺序排列,是否可以重新排序:
[“1”:1,“2”:3,“3”:5]
非常感谢任何帮助,非常感谢!
我的阵列:
【问题讨论】:
你的意思是数组是一个字典数组,比如 let array = [["2":3,"1": 1,"3":5,"1":7]]。 ? 数组是[["2": 3, "1": 1, "3": 5]], [["1":7]],所以第一个tableViewCell应该有3 collectionViewCells 其各自的标签文本为 1、3、5(注意我希望它们被重新排序)。第二个 tableViewCell 应该有 1 个 collectionViewCell,其标签为 7。非常感谢! 【参考方案1】:根据您的要求,这里是代码
import UIKit
class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource
// Global Variable
var tableView: UITableView!
var dataArray = [["2": 3, "1": 1, "3": 5], ["1":7]]
override func viewDidLoad()
super.viewDidLoad()
tableView = UITableView(frame: self.view.bounds)
tableView.delegate = self
tableView.dataSource = self
self.view.addSubview(tableView)
tableView.register(TableViewCell.self, forCellReuseIdentifier: "TableViewCell")
func numberOfSectionsInTableView(tableView: UITableView) -> Int
return 1
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return dataArray.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell: TableViewCell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath as IndexPath) as! TableViewCell
// Passing data to cellection cell
cell.cellData = dataArray[indexPath.row]
cell.backgroundColor = UIColor.groupTableViewBackground
return cell
class TableViewCell: UITableViewCell, UICollectionViewDataSource, UICollectionViewDelegate
var collectionView: UICollectionView!
var cellData = [String: Int]()
override init(style: UITableViewCellStyle, reuseIdentifier: String?)
super.init(style: style, reuseIdentifier: reuseIdentifier)
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = UICollectionViewScrollDirection.horizontal
collectionView = UICollectionView(frame: self.bounds, collectionViewLayout: layout)
collectionView.delegate = self
collectionView.dataSource = self
collectionView.register(CollectionCell.self, forCellWithReuseIdentifier: "CollectionViewCell")
collectionView.backgroundColor = UIColor.clear
self.addSubview(collectionView)
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
// MARK: UICollectionViewDataSource
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int
return 1
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
return cellData.count
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell: CollectionCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath as IndexPath) as! CollectionCell
cell.textLable.text = String(Array(cellData)[indexPath.row].value) // Please check here is some casting
cell.backgroundColor = .black
return cell
class CollectionCell: UICollectionViewCell
let textLable: UILabel =
let label = UILabel(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
label.textColor = .white
label.translatesAutoresizingMaskIntoConstraints = true
label.textAlignment = .center
return label
()
override init(frame: CGRect)
super.init(frame: frame)
setupLayout()
private func setupLayout()
addSubview(textLable)
required init?(coder aDecoder: NSCoder)
fatalError("init(coder:) has not been implemented")
希望它能解决你的问题。
结果
【讨论】:
嗨,rizwan,非常感谢!我目前不在我的电脑附近,但它看起来很完美!一旦我测试了它,我会为你投票!最后一件事,是否可以重新排序数组,使第一个 tableViewCell 是 1、3、5 而不是 3、1、5?再次感谢你? 很高兴它对您有所帮助,重新排序只需更改您想要的数据数组方式,例如 [["1":7],["2": 3, "1": 1, "3 ": 5]]. 对不起,我的意思是我可以重新排序数组值,所以它是 [[“1”: 1, “2”: 3, “3”: 5]]。基本上每个字典的第一个值是1、2、3?如果不手动进行,是否有一些代码或代码可以使这成为可能?请注意,这些值不需要是字符串,当我从服务器检索它们时,我可以将它们转换为 Int 值。谢谢! 对于更改顺序,您必须根据需要对数据进行排序,您可以根据值和排序规则对数组进行排序,还可以根据键或值对字典进行排序***.com/questions/24090016/… 和第二个喜欢是***.com/questions/31088974/… 嗨,rizwan,它运行良好,再次感谢您!你帮了大忙! ?【参考方案2】:如果我理解正确,你有一个数组,格式有点奇怪
array = [[["2": 3, "1": 1, "3": 5]], [["1":7]]]
由于集合视图位于表格视图中,我假设您已经实现了NSTableViewDataSource
,然后您可以将表格视图的当前行保存为 tableView: viewFor: 中的属性,从而获取要使用的数组财产。由于您在数组中有一个数组,我们需要获取该数组中的第一项,然后过滤该键与当前 indexPath.row 匹配的项(字典)
let row = String(indexPath.row + 1)
let item = array[currentTableViewRow][0].filter $0.key = row
if !item.isEmpty
label.text = item.value
【讨论】:
您好 Joakim,非常感谢您的回复!稍后当我靠近我的计算机时,我会对其进行测试,如果它有效,我会给你一个赞!再次感谢? 嗨 Joakim,真的很抱歉,但请您解释一下“currentTableViewRow”的来源?谢谢! 是你在我文中提到的table view数据源方法中设置的属性。【参考方案3】:将其转换为 Array 用这个:
Array(array[indexPath.row].details.values)
并打印这个值你得到正确的数组以正确的顺序。
希望对你有帮助
谢谢。
【讨论】:
以上是关于使用字典值在 tableView 内填充 collectionView 的标签的主要内容,如果未能解决你的问题,请参考以下文章
使用 NSMutableDictionary 和数组填充单元格的 TableView