在我的CoreData中,我有一个Person实体,每个Person可以有多个(to Many)Statement实体。语句实体有一个名为amountOwed
的属性,它是一个十进制数量。现在我的想法是循环所有金额并将它们加起来,如果它们的正数量将它们添加到正数组,如果它们是负数,则将它们添加到该数组。然后使用该数组来确定每个部分需要显示多少个单元格。
我创建了一个fetchedResultsController
,我正在尝试将其用于for循环
for i in 0..<fetchedResultsController.fetchedObjects!.count {
let person = fetchedResultsController.fetchedObjects?[i]
let amountTotal = person?.value(forKeyPath: "statement.@sum.amountOwed") as? Decimal
if(amountTotal! <= Decimal(0) )
{
postiveCellNumber += 1
print("\(postiveCellNumber) postive number count")
}
else{
negativeCellNumber += 1
print("\(negativeCellNumber) negative number count")
}
}
然后,我试图在numberOfRowsInSection
函数中使用这些数组,如下所示:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
switch(section) {
case 0:
return postiveCellNumber
case 1:
return negativeCellNumber
default :return 0
}
}
我不认为我的for循环正常循环,因为我收到的错误是
索引0处的索引2处没有对象。
答案 0 :(得分:2)
如何使用两个不同的查询,一个用于正值,一个用于负值,两个不同的获取结果控制器?然后你可以让FRC为你做迭代和计数。
您将无法使用FRC管理部分。你必须自己做。为nil
指定sectionNameKeyPath
。那你想要像
func numberOfSections(in tableView: UITableView) -> Int {
return 2
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if section == 0 {
return positiveResultsController.fetchedObjects?.count ?? 0
}
else {
return negativeResultsController.fetchedObjects?.count ?? 0
}
}
或者
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if section == 0 {
let sectionInfo = positiveResultsController.sections![section]
return sectionInfo.numberOfObjects
}
else {
let sectionInfo = negativeResultsController.sections![section]
return sectionInfo.numberOfObjects
}
}
具有tableView(_:cellForRowAt:)
的相似逻辑。
答案 1 :(得分:0)
很难确定错误的具体原因,而没有详细了解如何构建FRC和tableView。但这一点看起来很可疑:
if(amountTotal! <= Decimal(0) )
{
postiveCellNumber += 1
print("\(postiveCellNumber) postive number count")
}
if条件肯定会回到前面:如果amountTotal! >= Decimal(0)
,你应该增加positiveCellNumber吗?
但是,除此之外,即使您成功计算了计数,您也将面临解决每个部分的每一行中应该出现哪些FRC的fetchedObjects的问题:
cellForRowAt
中,但这将涉及再次遍历fetchedObjects,以确定哪个出现在哪个部分,这是笨拙和低效的。 sectionNameKeyPath
和关联的排序描述符来自动将其提取的对象分配到正确的部分。这里的问题是无法使用计算的数字对提取进行排序。如果您想要采用此路线,则需要向totalAmountOwed
实体添加Person
属性,并确保在相关Statements
更改时更新。Persons
,另一个获得负数的负数。然后,您可以使用fetchedObjects数组为一个FRC填充第0部分,使用另一个FRC填充第1部分。总的来说,我认为这是我建议的解决方案。