Swift,将类数组添加到变量中不会更新原始类

时间:2016-04-23 08:12:15

标签: ios arrays swift uitableview

我是IOS的新手,请原谅我的编码错误。我遇到一个问题,我有一个tableView控制器有两个部分。第一部分有一个按钮,当点击时,将数据附加到数组中并删除它在第一部分中自己的行(我这样做是因为第一部分中有额外的非相关行)。第二部分中的行数基于array.count。

我的问题是我尝试了开始/结束更新,但它仍然无法正常工作。每当我运行下面的代码并运行startNewDay函数时(单击该按钮时),就会发生以下错误:

'尝试将第0行插入第1部分,但更新后第1部分只有0行'

这没有任何意义,因为我在插入新行之前已经添加了数组。在我附加之前,数组是空的。第二部分中不应该有与array.count相同的行数吗?

表格视图委托代码:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 2
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if section == 0 {
        if dataModel.lists[0].dayHasStarted == false {
            return 2
        } else {
            return 1
        }
    } else {
        if itemDoneCount == dataModel.lists[0].item.count && dataModel.lists[0].doneButtonVisible {
            return dataModel.lists[0].item.count + 1
        } else {
            return dataModel.lists[0].item.count
        }
    }
}
按下

startNewDay按钮功能:

@IBAction func startNewDayDidPress(sender: AnyObject) {
    dataModel.lists[0].dayHasStarted = true
    dataModel.lists[0].startDate = NSDate()
    addItemButton.enabled = !addItemButton.enabled

    // deleting start new day button

    let indexPath = NSIndexPath(forRow: 1, inSection: 0)
    let indexPaths = [indexPath]

    tableView.beginUpdates()
    tableView.deleteRowsAtIndexPaths(indexPaths, withRowAnimation: .Fade)
    tableView.endUpdates()

    // Inserting new array elements and rows into 2nd section

    let ritualsArray = dataModel.lists[0].rituals
    var itemsArray = dataModel.lists[0].item
    itemsArray.appendContentsOf(ritualsArray)

    tableView.beginUpdates()

    var insertRitualsArray = [NSIndexPath]()

    for item in itemsArray {
        let itemIndex = itemsArray.indexOf(item)
        let indexPath = NSIndexPath(forRow: itemIndex!, inSection: 1)
        insertRitualsArray.append(indexPath)
    }

    tableView.insertRowsAtIndexPaths(insertRitualsArray, withRowAnimation: .Top)
    tableView.endUpdates()

}

解决

此代码的问题与此主题的前一个标题完全没有关系,这可能会误导与我有相同问题的人。因此,我将改变它。之前的标题(好奇的)是:

" tableView.begin / end update不更新部分&#34中的行数;

对于可能遇到此问题的其他人来说,问题不在tableView委托中,也不在重新加载tableview数据。为了便于阅读,我将dataModel.list [0] .item放入itemsArray,将dataModel.list [0] .item放入ritualsArray。这显然会在追加时更新itemsArray而不是初始dataModel.list [0] .item,这会导致tableView中的第二部分不加载新的行数,从而导致在将行插入不存在的行时出错。

因此而不是:

    let ritualsArray = dataModel.lists[0].rituals
    var itemsArray = dataModel.lists[0].item
    itemsArray.appendContentsOf(ritualsArray)

这解决了它:

dataModel.list[0].item += dataModel.list[0].rituals

希望它可以帮助像我这样的初学者遇到这个问题。

最新更新

我最近发现数组是值类型,而不是引用类型。因此,将数组放入变量会生成该数组的副本,而不是作为原始数组的占位符。

初学者错误opps。

2 个答案:

答案 0 :(得分:3)

您收到的错误意味着数据源包含的数量与插入或删除行后的数量不同。这可能意味着数据未插入数据源数组,或者数据与numberOfRowsInSection函数中if语句中的条件不匹配。要对此进行故障排除,您应该在修改数据源数组后记录数据源数组的内容以检查其内容。如果它们是您所期望的(即,数据已正确添加),则问题在于您评估其内容以确定行数。如果内容不是您所期望的,那么问题在于您将数据插入数据源数组的方式。

答案 1 :(得分:0)

删除一行后我遇到了类似的问题。似乎如果 numberOfRowsInSection不连贯(等于最后一个值-1)此错误出现。 我看到你的numberOfRowsInSection中有一个条件,这可能是罪魁祸首