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 个单元格的主要内容,如果未能解决你的问题,请参考以下文章

VS2015 Git 源码管理工具简单入门

对对象成员、对象内部、向量内部所做的更改不会在方法结束后继续存在。 C++

Xcode:他的第一个视图没有看到第二个视图所做的更改

在连续的 java CompletionStages 之间对共享上下文对象所做的最新更改对于执行 lambda 的每个线程是不是始终可见

Visual Studio团队资源管理器 Git 源码管理工具简单入门

QFileSystemWatcher 不为另一个应用程序所做的更改发出 fileChanged 信号