Неустранимая ошибка: индекс выходит за пределы диапазона при обновлении источника данных таблицы - PullRequest
0 голосов
/ 06 декабря 2018

Кто-нибудь может дать разъяснение, почему мой код выбрасывает индекс вне диапазона, когда я пытаюсь добавить элемент в этот массив?Другие ответы в Интернете основаны на ситуации и не дают хорошего понимания того, как исправить ошибку.

Вот код для добавления в массив -

@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 голосов
/ 06 декабря 2018

В тот момент, когда вы пытаетесь установить элемент на позицию count + 1, ваш массив не инициализируется, потому что вы просто определяете тип вашего массива.Чтобы это исправить, сначала создайте пустой массив

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

, затем вместо присвоения элемента по несуществующему индексу вы можете добавить новый элемент в ваш массив

data.append(["type" : type,
             "details" : details,
             "cost" : cost])
0 голосов
/ 06 декабря 2018

Вам нужно инициализировать массив, так как текущее объявление 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...