swift - 如何在不更改模型的情况下将 tableview 划分为部分
问题描述
我正在尝试将部分添加到我的 UITableView。我能够创建部分并正确计算每个部分中的元素数量,单元格/图像与所有部分中的数据重复。
仅发布相关代码:
模型:
struct Product:Equatable {
let imagename: UIImage
}
var productarray = [
Product(imagename:#imageLiteral(resourceName: "blue")),
Product( imagename:#imageLiteral(resourceName: "CakeImage")),Product(imagename:#imageLiteral(resourceName: "vectorlogo")),
Product(imagename:#imageLiteral(resourceName: "PeasImge")),Product(imagename:#imageLiteral(resourceName: "castle")),
Product( imagename:#imageLiteral(resourceName: "scoobydoo")),Product(imagename:#imageLiteral(resourceName: "ufo")),
Product( imagename:#imageLiteral(resourceName: "wolfsky")),Product( imagename:#imageLiteral(resourceName: "universe")),
Product(imagename:#imageLiteral(resourceName: "werewolf")),Product( imagename:#imageLiteral(resourceName: "galaxy"))
]
视图控制器:
class ProductViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
let sections = ["Section A", "Section B","Section C", "Section D","Section E"]
let rowspersection = [2,3,2,2,2]
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
}
func numberOfSections(in tableView: UITableView) -> Int {
return sections.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return rowspersection[section]
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let data = productarray[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "ProductTableViewCell") as! ProductTableViewCell
cell.imageView?.image = data.imagename
cell.myParent = self
return cell
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 44
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
switch(section) {
case 0: return "Section A"
case 1: return "Section B"
case 2: return "Section C"
case 3: return "Section D"
case 4: return "Section E"
default: return ""
}
}
}
结果是:
解释:
模型“struct Product”中的“productarray”中的图像是:
blue, CakeImage, vectorlogo, PeasImge, castle, scoobydoo , ufo, wolfsky, universe, werewolf, galaxy
但模拟器中的最终产品是:
A部分:蓝色,CakeImage
B部分:蓝色,CakeImage,vectorlogo
C部分:蓝色,CakeImage
D部分:蓝色,CakeImage
E部分:蓝色,CakeImage
即图像/单元格重复,我不想发生这种情况。我希望将这些部分放置在我希望的单元格/图像之间。请帮助我。
我想要的是:-
A部分:蓝色,CakeImage
B部分:vectorlogo,PeasImge,城堡
C部分:史酷比,不明飞行物,
D部分:wolfsky,宇宙
E节:狼人,银河
注意:我不想更改模型“struct Product”,因为那样我将不得不更改我在这里没有提到的其他扩展代码。
解决方案
您的问题是每个部分从第 0 行开始,并且考虑到每个部分没有固定的行数,您将必须计算在产品数组中前进的位置,如下所示:
func getIndex(indexPath: IndexPath) -> Int {
var index = 0
for i in 0..<indexPath.section {
index += rowspersection[i]
}
index += indexPath.row
return index
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let data = productarray[getIndex(indexPath: IndexPath)]
let cell = tableView.dequeueReusableCell(withIdentifier: "ProductTableViewCell") as! ProductTableViewCell
cell.imageView?.image = data.imagename
cell.myParent = self
return cell
}
更好的解决方案不是为此使用数组,而是使用如下部分映射的字典:
产品:
var productMap = [
0: [ Product(imagename:#imageLiteral(resourceName: "blue")), Product( imagename:#imageLiteral(resourceName: "CakeImage")) ]
1: [ Product(imagename:#imageLiteral(resourceName: "vectorlogo")), Product(imagename:#imageLiteral(resourceName: "PeasImge")), Product(imagename:#imageLiteral(resourceName: "castle"))],
2: [ Product( imagename:#imageLiteral(resourceName: "scoobydoo")),Product(imagename:#imageLiteral(resourceName: "ufo"))] ,
3: [ Product( imagename:#imageLiteral(resourceName: "wolfsky")),Product( imagename:#imageLiteral(resourceName: "universe")) ],
4: [ Product(imagename:#imageLiteral(resourceName: "werewolf")),Product( imagename:#imageLiteral(resourceName: "galaxy")) ]
]
在 VC 中:
func numberOfSections(in tableView: UITableView) -> Int {
return productMap.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return productMap[section]?.count ?? 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let data = productMap[indexPath.section][indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "ProductTableViewCell") as! ProductTableViewCell
cell.imageView?.image = data.imagename
cell.myParent = self
return cell
}
推荐阅读
- python-3.x - 具有级联 QSortFilterProxyModel 的信号顺序
- javascript - 我如何在这里使用多个 csv 文件并使图形每 5 秒更新一次?
- c - Gcovr --object-directory 选项在 .gcda 文件与 .o 文件位于不同目录时无法正常工作
- r - 基于单个过滤器创建变异列
- excel - 根据列中条目数调整的公式
- go - Golang:切片上的元素分割
- android - notifyItemChanged(position) 没有更新视图
- html - Safari 无法识别按钮样式的链接的边框半径
- c++ - 从 C++ 客户端通过 TCP 向 JSON 服务器发送数据
- java - 使用 Spring webflux 和 WebTestClient 获取请求属性