【问题标题】:Swift, adding a class array into a variable does not update array content in original classSwift,将类数组添加到变量中不会更新原始类中的数组内容
【发布时间】:2016-08-16 22:36:07
【问题描述】:

我是 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 不更新section中的行数”

对于可能遇到此问题的其他人,问题不在于 tableView 委托,也不在于重新加载 tableview 数据。为便于阅读,我将 dataModel.list[0].item 放入 itemsArray 中,将 dataModel.list[0].item 放入仪式阵列中。这显然会在附加时更新 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

希望它能帮助像我这样遇到此问题的初学者。

最新更新

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

初学者错误操作。

【问题讨论】:

  • 单个插入/删除操作不需要begin/endUpdates。它仅对多个不同的操作有用,例如同时移动和删除。
  • 哦,好的,我会记住的。这只是不必要的代码,不会干扰任何事情,对吧?抱歉,我是新手,还在学习!
  • 是的,在您的代码中,您可以删除所有 begin/endUpdates 行。

标签: ios arrays swift uitableview


【解决方案1】:

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

【讨论】:

  • 您好,感谢您的回答。它起作用了,显然它没有正确附加到我的数组中,我觉得这很奇怪。将 dataModel.list[0].item 放入变量 itemArray 和 itemArray.appendContentsOf 不会更新 dataModel.list[0].item 数组。你知道为什么会这样吗?我的新代码:dataModel.lists[0].item += dataModel.lists[0].rituals
  • 我对 Swift 不熟悉。但是,这是 Objective C 中的预期行为。如果将 dataModel.list[0].item 放入 itemArray,然后附加到 itemArray,则 itemArray 是 dataModel.list[0].item 的副本。它包含与原始数组相同的对象,但对副本所做的更改不会反映在原始数组中。您必须在更改 itemArray 后将 dataModel.list[0].item 设置为 itemArray,以便原始数组反映更新后数组的内容。或者(更容易)你可以做你所做的 - 直接更新 dataModel.lists[0].item。
  • 好的,谢谢你的详细解答,非常感谢!
【解决方案2】:

删除一行后我遇到了类似的问题。看来如果 numberOfRowsInSection is not coherent (equal to last value -1) 出现此错误。 我看到你的 numberOfRowsInSection 中有一个条件,这可能是罪魁祸首

【讨论】:

  • 您好 Frederic,首先,感谢您的帮助!我解决了我的问题,方法是不将两个数组都放入变量(itemArray 和仪式数组并将一个附加到另一个),而是使用 += 运算符直接附加它,如下所示:dataModel.lists[0].item += dataModel.lists[0].rituals
猜你喜欢
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
相关资源
最近更新 更多