一个小上下文 - 我有一个名为SelectedListItemsViewController的ViewController,它有一个由一个名为selectedListItems
的Realm Model Objects数组填充的TableView。这里有一个Add bar按钮项,导航到另一个名为AllListItemsViewController的ViewController,它有一个由一个名为allListItems
的Realm Model Objects数组填充的TableView,每个单元格都包含一个UISwitch。
前面提到的两个数组都基于同一个类,它有一个名为isSelected
的布尔属性。在我的代码中,我目前已将其设置为当我在AllListItemsViewController中的单元格中切换UISwitch时,如果它在' on' isSelected
indexPath.row
的{{1}}属性更改为allListItems
,对象将附加到true
数组。这部分似乎工作正常。
将开关拨到“关闭”状态。导致selectedListItems
isSelected
的{{1}}属性更改为indexPath.row
,并且该对象的索引将从allListItems
移除。这在大多数情况下都适用,但有时候切换UISwitch的单元格' off'以错误的顺序(如果他们在索引0处转过来,然后是1,然后是2,然后我尝试将索引1转为“关闭”,那么它会使模拟崩溃,可能是由于指数超出了范围。
在编程方面,我非常业余,因此我确信以下代码是草率的,我怀疑我是以最好/最有效的方式实现我的目标。
false
有没有更好的方法来解决这个没有导致运行时错误的边缘情况?我有一个想法是,记录selectedListItems
的索引可能不是最好的路线,因为它是一个全局变量并且懒惰地计算,所以它不总是最新的。另一个想法是,当我创建对象属性的数组来跟踪索引时,有些东西会在翻译中丢失,而不是能够在对象数组本身中找到给定点的索引。 / p>
答案 0 :(得分:0)
在最近3个小时左右晃动后,我想通了。在我的switchState
的其他情况下,而不是使用
let indexInSelected = arraySelected.indexOf(listItemInCell)!
selectedListItems.removeAtIndex(indexInSelected)
我改为使用
let objectToRemove = self.appearanceArray[indexPath.row]
for object in selectedListItems {
if object == objectToRemove {
selectedListItems.removeAtIndex(selectedListItems.indexOf(objectToRemove)!)
}
}
这似乎完全解决了我遇到的一些删除案例的索引超出范围的问题。它看起来我可以摆脱一些不必要的代码,它支持原来的两行。