Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当有2个节时,从CoreData填充节中的行数_Ios_Arrays_Core Data_Swift3 - Fatal编程技术网

Ios 当有2个节时,从CoreData填充节中的行数

Ios 当有2个节时,从CoreData填充节中的行数,ios,arrays,core-data,swift3,Ios,Arrays,Core Data,Swift3,在我的CoreData中,我有一个Person实体,每个Person可以有多个(到多个)语句实体。语句实体有一个名为amounted的属性,该属性是十进制数。现在我的想法是循环所有数量并将它们相加,如果它们是正数,则将它们添加到正数数组中,如果它们是负数,则将它们添加到该数组中。然后使用该数组计算每个部分需要显示多少单元格 我创建了一个fetchedResultsController,并尝试将其用于for循环 for i in 0..<fetchedResultsController.fe

在我的CoreData中,我有一个Person实体,每个Person可以有多个(到多个)语句实体。语句实体有一个名为
amounted
的属性,该属性是十进制数。现在我的想法是循环所有数量并将它们相加,如果它们是正数,则将它们添加到正数数组中,如果它们是负数,则将它们添加到该数组中。然后使用该数组计算每个部分需要显示多少单元格

我创建了一个
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")
        }

    }
我认为我的for循环没有正确循环,因为我得到了一个错误,上面写着

索引0处的节中索引2处没有对象


使用两个不同的查询(一个用于正值,另一个用于负值)和两个不同的获取结果控制器如何?然后,您可以让FRC为您进行迭代和计数

您将无法使用FRC来管理分区。你得自己做。为
部分nameKeyPath
指定
nil
。那你想要什么

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(u:cellForRowAt:)

来说,如果不了解FRC和tableView的构造方式,就很难确定错误的具体原因。但这一点看起来很可疑:

    if(amountTotal! <= Decimal(0) )
    {
        postiveCellNumber += 1
        print("\(postiveCellNumber) postive number count")
    }
if(amountTotal!=十进制(0)

但除此之外,即使您成功地计算了计数,您也将面临一个问题,即确定FRC的哪些获取对象应该出现在每个部分的每一行中:

  • 您可以在
    cellForRowAt
    中“动态”执行此操作,但这将涉及再次迭代获取的对象,以确定哪个对象出现在哪个部分,这既笨拙又低效
  • 一旦FRC完成其performFetch,您可以一次性将FetchedObject分离为两个单独的数组。但是,当FRC的FetchedObject数组更新时,您需要非常难看的FRC委托方法来更新这两个数组
  • 您可以通过为基础获取指定
    sectionNameKeyPath
    和相关的排序描述符,将FRC配置为自动将其获取的对象分配到正确的部分。这里的问题是无法使用计算出的数字对获取进行排序。如果您要执行此路线,您需要将
    TotalAmounted
    属性添加到您的
    Person
    实体中,并确保在相关
    语句发生更改时更新该属性
  • 或者,您可以按照@HalMueller的建议,使用两个单独的FRC。您可以对基础回迁使用互补谓词,一个用于仅获取欠款金额为正的
    人员,另一个用于获取欠款金额为负的人员。然后,您可以对一个FRC使用FetchedObject数组来填充扇区I在0上,另一个FRC填充第1节。总的来说,我认为这是我建议的解决方案

你应该编辑你的问题,以显示你的
cellforrowatinexpath
方法。此外,
postiveArray
negativeArray
都是混淆变量名(因此我键入了一个错误假设的答案)。您应该将名称更改为更有意义的名称,如
positiveEntryCount
numberOfPositiveEntries
。更好的做法是将核心数据的正负结果填充到实际数组中。Michael,仅使用数字表示单元格数量而不是数组的想法是我想要FetchedResultsController仍然处理所有ViewTable NSFetchedResultsController委派操作。我更新了问题,使其看起来更好。我在上一篇文章中为您提供了获取值的确切解决方案,但您仍然尝试使用不安全的方法获取值…谢谢!我将尝试Hal的想法。您能弹出吗使用两个不同的FRC创建一个桌面视图?@icekomo是的,这是完全可能的。在上面Hal的回答和你最近的其他问题/答案之间,你已经非常接近了。@pbasdf,谢谢,我想我已经完成了这个部分的工作,但现在似乎已经在这个领域卡住了:这是我第一次使用FRC,所以我很高兴对它的工作方式有点陌生。你能使用多个FRC来填充一个tableView吗?有人告诉我这可能不可能。是的。你只需要注意你所在的分区,并使用正确的FRC进行对话。确保你有不同的缓存名称。我在尝试此操作时遇到了这个问题:@dmorgang是正确的,你需要要自己管理节indexPath。每当要求您使用节1时,您需要将该indexPath从[1,n]转换为[0,n],并使用“其他”FRC。
    if(amountTotal! <= Decimal(0) )
    {
        postiveCellNumber += 1
        print("\(postiveCellNumber) postive number count")
    }