UITableView 将所做的更改应用于每个第 n 个单元格
Posted
技术标签:
【中文标题】UITableView 将所做的更改应用于每个第 n 个单元格【英文标题】:UITableView applying changes done to every nth cell 【发布时间】:2020-01-29 22:19:14 【问题描述】:我有一个 TableView 设置,其中包含不同的部分和项目。
当我选择一个单元格时,图像被取消隐藏。
但是,它不仅对一个单元格执行此操作,在这种情况下,它还对每 8 个单元格执行此操作。在另一个项目中,这个数字是十分之一。
有人知道为什么会发生这种情况以及如何解决吗?
import UIKit
struct Section
let letter : String
let names : [String]
var sections = [Section]()
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
@IBOutlet weak var table: UITableView!
var data = ["Alb","bim","ck","Da","Esel","fried","fried","fried","fried","fried","fried","fried","fried","fried","fried","fried","fried","fried","fried","fried","fried","fried","spacko","yarr","mom","nun","loser","zebra","jao","ihr","peep","reee","vogel","xylo","uuuf","tiiii","qqqq","m","z","aw","bim","ce","did","Esel","fried","fried","fried","fried","fried","fried","fried","fried","fried","fried","fried","fried","fried","fried","fried","fried","fried","spacko","yarrack","mom","nun","loser","zebra","jao","ihr","peep","reee","vogel","xylo","uuuf","tiiii","qqqq","m","z"]
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return sections[section].names.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
return cell
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
return sections[section].letter
func sectionIndexTitles(for tableView: UITableView) -> [String]?
return sections.map$0.letter
override func viewDidLoad()
super.viewDidLoad()
table.rowHeight = 90.0
let groupedDictionary = Dictionary(grouping: data, by: String($0.prefix(1)))
let keys = groupedDictionary.keys.sorted()
sections = keys.map Section(letter: $0, names: groupedDictionary[$0]!.sorted())
table.reloadData()
func numberOfSections(in tableView: UITableView) -> Int
return sections.count
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
let cell = tableView.cellForRow(at: indexPath) as! TableViewCell
cell.checkmark.isHidden = !cell.checkmark.isHidden
import UIKit
class TableViewCell: UITableViewCell
override func awakeFromNib()
super.awakeFromNib()
// Initialization code
@IBOutlet weak var checkmark: UIImageView!
override func setSelected(_ selected: Bool, animated: Bool)
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
【问题讨论】:
【参考方案1】:单元格被重新用作您的滚动条。您需要确保cellForRowAt
根据数据模型正确配置出列单元格; IE。如果选择了row
,则显示复选标记。如果未选中,请将其隐藏。
由于您的 cellForRowAt
基本上是空的,因此单元格的显示与上次用于一行时完全相同。
您可以在配置单元格时使用集合来跟踪选定的行并检查其内容:
var selectedRows = Set<IndexPath>()
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
cell.checkmark.isHidden = !self.selectedRows.contains(indexPath)
return cell
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
if self.selectedRows.contains(indexPath)
self.selectedRows.remove(indexPath)
else
self.selectedRows.insert(indexPath)
tableView.reloadRows(at:[indexPath], with: .none)
【讨论】:
【参考方案2】:您可以创建一个数组数组,其中根据行和部分存储索引中行的布尔值,当您在任何部分的任何行中进行更改时,然后更改布尔值您可以在 didselect 行中检测到的特定部分中的特定行,您可以在其中获取哪个单元格 didselect 工作的部分,然后重新加载特定行或表并根据创建的数组数组设置值。
【讨论】:
以上是关于UITableView 将所做的更改应用于每个第 n 个单元格的主要内容,如果未能解决你的问题,请参考以下文章
对对象成员、对象内部、向量内部所做的更改不会在方法结束后继续存在。 C++
在连续的 java CompletionStages 之间对共享上下文对象所做的最新更改对于执行 lambda 的每个线程是不是始终可见