如何在不更改模型的情况下将表格视图分成几个部分
How to divide tableview into sections without changing the model
我正在尝试向我的 UITableView 添加部分。我能够创建部分并正确计算每个部分中的元素数量,cells/images 重复所有部分中的数据。
仅发布相关代码:
型号:
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
即images/cells 正在重复,我不想发生这种情况。我希望这些部分按照我的意愿放置在 cells/images 之间。请帮助我。
我想要的是:-
A 部分:蓝色,CakeImage
B 部分:vectorlogo、PeasImge、城堡
C 部分:史酷比,不明飞行物,
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
}
我正在尝试向我的 UITableView 添加部分。我能够创建部分并正确计算每个部分中的元素数量,cells/images 重复所有部分中的数据。
仅发布相关代码:
型号:
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
即images/cells 正在重复,我不想发生这种情况。我希望这些部分按照我的意愿放置在 cells/images 之间。请帮助我。
我想要的是:-
A 部分:蓝色,CakeImage
B 部分:vectorlogo、PeasImge、城堡
C 部分:史酷比,不明飞行物,
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
}