TableView 在 Swift 中展开和折叠单元格
TableView expand and collapse cells in Swift
您好,我看过关于这个问题的教程,我可以在我的 table 视图中打开和关闭点击的部分,但是如果一个部分打开并且我要打开另一个部分,我想要上一个要关了,我关不了
TableViewCodes
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let section = sections[section]
if section.isOpened {
return section.options.count + 1
} else {
return 1
}
}
func numberOfSections(in tableView: UITableView) -> Int {
return sections.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.row == 0 {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "headerCell", for: indexPath) as? HeaderView else {return UITableViewCell()}
cell.backgroundColor = #colorLiteral(red: 0.9607108235, green: 0.9608257413, blue: 0.9606716037, alpha: 1)
cell.titleLabel?.text = sections[indexPath.section].title
return cell
} else {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as? CustomTableViewCell else {return UITableViewCell()}
cell.backgroundColor = #colorLiteral(red: 0.9607108235, green: 0.9608257413, blue: 0.9606716037, alpha: 1)
cell.titleLabel?.text = sections[indexPath.section].options[indexPath.row - 1]
return cell
}
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
sections[indexPath.section].isOpened = !sections[indexPath.section].isOpened
tableView.reloadSections([indexPath.section], with: .none)
}
剖面模型
class Section {
let title: String
let options: [String]
var isOpened: Bool = false
init(title: String, options: [String], isOpened: Bool = false) {
self.title = title
self.options = options
self.isOpened = isOpened
}
}
ViewDidLoad
sections = [
Section(title: "Spor Giyim 1", options: [1,2,3].compactMap({ return "Cell \([=13=])" }), isOpened: true),
Section(title: "Spor Giyim 2", options: [1,2,3].compactMap({ return "Cell \([=13=])" }), isOpened: false),
Section(title: "Spor Giyim 3", options: [1,2,3].compactMap({ return "Cell \([=13=])" }), isOpened: false),
Section(title: "Spor Giyim 4", options: [1,2,3].compactMap({ return "Cell \([=13=])" }), isOpened: false)
]
您需要将它们全部重置为 false
然后切换点击部分的当前状态
let toSet = !sections[indexPath.section].isOpened
sections.forEach {
[=10=].isOpened = false
}
sections[indexPath.section].isOpened = toSet
tableView.reloadData()
在 viewController 中存储对任何打开的部分的引用,使用它将其重置为关闭,然后重新加载该部分和您要打开的部分:
class myVC: UIViewController {
var openSection: Int?
// rest of the VC...
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
if let openSection = openSection, openSection != indexpath.section {
section[openSection].isOpened = false
section[indexPath.section].isOpened = true
tableView.reloadSections([ openSection, indexPath.section], with: .automatic)
openSection = indexPath.section
} else {
sections[indexPath.section].isOpened.toggle()
tableView.reloadSections([indexPath.section], with: .automatic)
openSection = sections[indexPath.section].isOpened ? indexPath.section : nil
}
}
您好,我看过关于这个问题的教程,我可以在我的 table 视图中打开和关闭点击的部分,但是如果一个部分打开并且我要打开另一个部分,我想要上一个要关了,我关不了
TableViewCodes
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let section = sections[section]
if section.isOpened {
return section.options.count + 1
} else {
return 1
}
}
func numberOfSections(in tableView: UITableView) -> Int {
return sections.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.row == 0 {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "headerCell", for: indexPath) as? HeaderView else {return UITableViewCell()}
cell.backgroundColor = #colorLiteral(red: 0.9607108235, green: 0.9608257413, blue: 0.9606716037, alpha: 1)
cell.titleLabel?.text = sections[indexPath.section].title
return cell
} else {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as? CustomTableViewCell else {return UITableViewCell()}
cell.backgroundColor = #colorLiteral(red: 0.9607108235, green: 0.9608257413, blue: 0.9606716037, alpha: 1)
cell.titleLabel?.text = sections[indexPath.section].options[indexPath.row - 1]
return cell
}
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
sections[indexPath.section].isOpened = !sections[indexPath.section].isOpened
tableView.reloadSections([indexPath.section], with: .none)
}
剖面模型
class Section {
let title: String
let options: [String]
var isOpened: Bool = false
init(title: String, options: [String], isOpened: Bool = false) {
self.title = title
self.options = options
self.isOpened = isOpened
}
}
ViewDidLoad
sections = [
Section(title: "Spor Giyim 1", options: [1,2,3].compactMap({ return "Cell \([=13=])" }), isOpened: true),
Section(title: "Spor Giyim 2", options: [1,2,3].compactMap({ return "Cell \([=13=])" }), isOpened: false),
Section(title: "Spor Giyim 3", options: [1,2,3].compactMap({ return "Cell \([=13=])" }), isOpened: false),
Section(title: "Spor Giyim 4", options: [1,2,3].compactMap({ return "Cell \([=13=])" }), isOpened: false)
]
您需要将它们全部重置为 false
然后切换点击部分的当前状态
let toSet = !sections[indexPath.section].isOpened
sections.forEach {
[=10=].isOpened = false
}
sections[indexPath.section].isOpened = toSet
tableView.reloadData()
在 viewController 中存储对任何打开的部分的引用,使用它将其重置为关闭,然后重新加载该部分和您要打开的部分:
class myVC: UIViewController {
var openSection: Int?
// rest of the VC...
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
if let openSection = openSection, openSection != indexpath.section {
section[openSection].isOpened = false
section[indexPath.section].isOpened = true
tableView.reloadSections([ openSection, indexPath.section], with: .automatic)
openSection = indexPath.section
} else {
sections[indexPath.section].isOpened.toggle()
tableView.reloadSections([indexPath.section], with: .automatic)
openSection = sections[indexPath.section].isOpened ? indexPath.section : nil
}
}