如何解决如何在不更改模型的情况下将表格视图分为多个部分
我正在尝试将部分添加到我的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]
@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部分:scoobydoo,ufo
D部分:沃尔夫斯基,宇宙
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
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。