无法在Swift中的Array中追加和移除选定的表视图单元格JSON ID

lokaqttq  于 2023-03-28  发布在  Swift
关注(0)|答案(2)|浏览(96)

如果我点击单元格,我需要arrSelectedRowsBuy中的选定单元格eventListData?.result?.events?[indexPath. row].id not(indexPath.row),如果我再次点击它,则选定的id应从arrSelectedRowsBuy中删除

我需要从eventListData?.result?.events?[indexPath.row].idarrSelectedRowsBuy选择/删除ID

但在我的代码中,我在arrSelectedRowsBuy中获取选定的行索引,如[0,1,2,3],但我的eventListData?.result?.events?[indexPath.row].id将是[22,8,4]。

**代码:**这里,如果我像这样附加arrSelectedRowsBuy.append(eventListData?.result?.events?[indexPath.row].id ?? 0),那么总代码不工作

var arrSelectedRowsBuy:[Int] = []

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

let cell = tableView.dequeueReusableCell(withIdentifier: "EventListCell", for: indexPath) as! EventListCell

let indexData = eventListData?.result?.events?[indexPath.row]
cell.titleLbl.text = indexData?.event_title
return cell
}


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

let cell:EventListCell = tableView.cellForRow(at: indexPath) as! EventListCell
let indexData = eventListData?.result?.events?[indexPath.row]

if arrSelectedRowsBuy.contains(indexPath.row) {
    if let index = arrSelectedRowsBuy.firstIndex(of: indexPath.row) {
        cell.checkImg.image = UIImage(named: "checkbox_inactive")
        
        arrSelectedRowsBuy.remove(at: index)
    }
} else {
    
    cell.checkImg.image = UIImage(named: "blue_tick")
    
    arrSelectedRowsBuy.append(indexPath.row)
}
}
fzsnzjdm

fzsnzjdm1#

下面是一些可以在Playground中编译(但不能运行)的示例代码,Playground基于原始代码:

import UIKit

class EventListCell: UITableViewCell {
    init(style: UITableViewCell.CellStyle, reuseIdentifier: String) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    var checkImg = UIImageView()
}

struct EventListData {
    var result: Result?

    struct Result {
        var events: [Event]?

        struct Event {
            var id: Int
        }
    }
}

var eventListData: EventListData?
var arrSelectedRowsBuy:[Int] = []

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)  {
    let cell:EventListCell = tableView.cellForRow(at: indexPath) as! EventListCell
    let indexData = eventListData?.result?.events?[indexPath.row]

    if arrSelectedRowsBuy.contains(indexPath.row) {
        if let index = arrSelectedRowsBuy.firstIndex(of: indexPath.row) {
            cell.checkImg.image = UIImage(named: "checkbox_inactive")

            arrSelectedRowsBuy.remove(at: index)
        }
    } else {

        cell.checkImg.image = UIImage(named: "blue_tick")

        arrSelectedRowsBuy.append(indexPath.row)
    }
}

由于问题是如何在数组中存储数据模型id而不是行号,因此我简单地更改了代码来实现这一点(并删除了对contains的不必要调用,因为如果行号不存在,将无法找到索引):

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)  {
    let cell:EventListCell = tableView.cellForRow(at: indexPath) as! EventListCell

    if let indexData = eventListData?.result?.events?[indexPath.row] {
        if let index = arrSelectedRowsBuy.firstIndex(of: indexData.id) {
            cell.checkImg.image = UIImage(named: "checkbox_inactive")
            arrSelectedRowsBuy.remove(at: index)
        } else {
            cell.checkImg.image = UIImage(named: "blue_tick")
            arrSelectedRowsBuy.append(indexData.id)
        }
    }
}

原始代码没有按行顺序保存arrSelectedRowsBuy,如果不需要这样做,那么使用Set代替Array会使代码更简洁、更高效:

var arrSelectedRowsBuy:Set<Int> = []

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)  {
    let cell:EventListCell = tableView.cellForRow(at: indexPath) as! EventListCell

    if let indexData = eventListData?.result?.events?[indexPath.row] {
        if arrSelectedRowsBuy.remove(indexData.id) != nil {
            cell.checkImg.image = UIImage(named: "checkbox_inactive")
        } else {
            cell.checkImg.image = UIImage(named: "blue_tick")
            arrSelectedRowsBuy.insert(indexData.id)
        }
    }
}

如果顺序很重要,那么可以使用IndexSet来存储行索引(是的,回到那个!),并使用computed属性来计算数据模型id:

var selectedRows = IndexSet()

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

    let cell:EventListCell = tableView.cellForRow(at: indexPath) as! EventListCell

    if selectedRows.remove(indexPath.row) != nil {
        cell.checkImg.image = UIImage(named: "checkbox_inactive")
    } else {
        cell.checkImg.image = UIImage(named: "blue_tick")
        selectedRows.insert(indexPath.row)
    }
}

var arrSelectedRowsBuy: [Int] {
    selectedRows.compactMap { row in
        eventListData?.result?.events?[row].id
    }
}

我还没有测试过这段代码,但它确实可以编译。当然,如果数据模型实际上不包含indexPath.row上的事件,这将崩溃。如果eventListData?.result?.events?可选链沿着某个地方有nils,它将以神秘的方式失败。为什么数据模式充满了可选项是一个完全不同的问题。

ejk8hzay

ejk8hzay2#

从给定的代码中理解你的问题有点困难,但是因为你说写一个答案,我试着给你一些例子。
如果你定义了一个数组并用你的json填充它,现在你有了一个有序数组,indexPath将等于你的JSON,不管ID是什么。所以“If语句”看起来是不必要的和多余的“if arrSelectedRowsBuy.contains(indexPath.row){”,因为你确信你的JSON中有当前元素。

var JSON = [1,2,3,4,5,5,6,7]

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    JSON.remove(at: indexPath.row)
}

所以你不应该搜索ID然后删除,假设你没有ID,你用JSON数组填充你的TableView,然后用户选择一个单元格(例如第三个),你从你的JSON中删除第三个。如果你关心ID的顺序,你需要在填充你的TableView之前对你的JSON进行排序。我不知道你的JSON结构是什么,所以我只是写了一个INT JSON来演示代码。

相关问题