didSelectRowAt 更改所有行中的值

Posted

技术标签:

【中文标题】didSelectRowAt 更改所有行中的值【英文标题】:didSelectRowAt changing values in all rows 【发布时间】:2018-07-24 07:17:11 【问题描述】:

我不知道 didSelectRowAt 方法如何更改数组中的所有元素(在每个索引处) 打印语句用于可视化结果,因此在单击单元格 1 两次后,我得到: 1 真的 真的 真的 1 假假假的

不知道 indexPath.row 是如何变得疯狂并针对我的数组的整个范围进行的 任何帮助将不胜感激

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return itemArray.count


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath)

    cell.textLabel?.text = itemArray[indexPath.row].title

    if itemArray[indexPath.row].done == true 
        cell.accessoryType = .checkmark
    else
        cell.accessoryType = .none
    

    return cell


//MARK: TableView Delegate methods

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 

    print(indexPath.row)
    if itemArray[indexPath.row].done == true 
        itemArray[indexPath.row].done = false

        print(itemArray[indexPath.row].done, itemArray[indexPath.row-1].done, itemArray[indexPath.row+1].done)

    else
        itemArray[indexPath.row].done = true
        print(itemArray[indexPath.row].done, itemArray[indexPath.row-1].done, itemArray[indexPath.row+1].done)
    

    tableView.reloadData()
    tableView.deselectRow(at: indexPath, animated: true)


项目类型是:

class Item 
    var title : String = ""
    var done : Bool = false

数组的填充方式如下:

override func viewDidLoad() 
    super.viewDidLoad()

    let newItem: Item = Item()
    newItem.title = "asdaS"
    itemArray.append(newItem)
    itemArray.append(newItem)
    itemArray.append(newItem)


【问题讨论】:

如何在itemArray 中添加项目?所述项目的类型是什么?你能分享那个代码吗? 现在它只是带有自定义类型 item 的硬编码数组:class Item var title : String = "" var done : Bool = false 请不要在 cmets 中发布代码。相反,更新问题并在填充数组的位置添加相关代码 【参考方案1】:

您只是创建一个对象并将同一个对象附加到数组中。当您更改任何索引时,它会更新整个数组,因为所有索引都包含某个对象

class Item 
    var name = ""
    var done = true


let x = Item()
var arr = [Item]()
for _ in 0..<5 
    arr.append(x)


print(arr.flatMap( $0.done )) //[true, true, true, true, true]
arr[1].done = false
print(arr.flatMap( $0.done )) //[false, false, false, false, false]

你需要做的是为每个索引创建一个单独的对象

class Item 
    var name = ""
    var done = true


var arr = [Item]()
for _ in 0..<5 
    let x = Item() //NOTICE THAT THIS LINE HAS BEEN MOVED INSIDE THE LOOP
    arr.append(x)


print(arr.flatMap( $0.done )) //[true, true, true, true, true]
arr[1].done = false
print(arr.flatMap( $0.done )) //[true, false, true, true, true]

【讨论】:

谢谢,看来我只有一个元素的数组,在不同的行中超过 1 次,所以我的 indexPath.row 并没有变得疯狂 不用担心。干杯

以上是关于didSelectRowAt 更改所有行中的值的主要内容,如果未能解决你的问题,请参考以下文章

如何链接多个组合框表中的两个组合框?

如何为所有行中所有字段中的所有表替换 MySQL 数据库中的字符串?

使用自定义适配器更改 ListView 中特定行中的 ImageView

无法更改标题中的按钮标题

将更改事件绑定到每个 DataTables 行中的复选框

从 UITableView 中删除行会更改存储在其他行中的信息