【发布时间】: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