致命错误:更新表的数据源时索引超出范围

时间:2018-12-06 11:09:25

标签: swift tableview nstableview

有人试图在我向该数组添加项目时为什么我的代码将索引超出范围的原因澄清吗?网路上的其他答案都是根据情况而定,无法很好地纠正错误。

这是添加到数组的代码-

@IBAction func refreshData(_ sender: Any) {
        let type = "type"
        let cost = dataAdded.shared.cost
        let details = dataAdded.shared.details
        let count = data?.count

        (data!)[count! + 1] = [
        "type" : type,
        "details" : details,
        "cost" : cost
            ] as! [String : String]
        self.tableView.reloadData()
    }

}

这是用于生成TableView的代码-

func numberOfRows(in tableView: NSTableView) -> Int {
        return (data?.count)!
    }

    func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
        let item = (data!)[row]
        let cell = tableView.makeView(withIdentifier: (tableColumn!.identifier), owner: self) as? NSTableCellView
        cell?.textField?.stringValue = item[(tableColumn?.identifier.rawValue)!]!
        return cell
    }

像这样声明数组-

var data: [[String: String]]?

这可能是个问题吗?

2 个答案:

答案 0 :(得分:1)

您需要初始化数组,因为当前声明为nil

var data =  [[String: String]]()

并追加到数组中,最好有一个

struct Item {

    let type:String
    let details:String
    let cost:String

}

var data =  [Item]()
data.append(Item(type: type, details: details, cost: cost))

答案 1 :(得分:1)

当您尝试将元素设置在位置count + 1时,您的数组未初始化,因为您只是定义了数组的类型。要解决此问题,请先创建一个空数组

var data = [[String: String]]()

然后,您可以代替在不存在的索引上分配元素,将新元素添加到数组中

data.append(["type" : type,
             "details" : details,
             "cost" : cost])