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 数据库中的字符串?