第一个TableView部分标题没有';t卷轴Swift 4

第一个TableView部分标题没有';t卷轴Swift 4,swift,uitableview,core-data,nsfetchedresultscontroller,Swift,Uitableview,Core Data,Nsfetchedresultscontroller,我正在为我的应用程序构建SalesViewController,它由一个TableView组成,显示在日期范围内找到的所有项目。 项目是订单的子项,它具有类别,日期,项目ID,项目名称,价格属性所有字符串。 我终于成功地将itemFetchResultController的结果正确地划分为几个部分,因为我的sortDescriptor错误。在配置itemFetchResultController时,我希望使用从已获取的Item实体中获取的category属性作为填充的TableView中显示的部

我正在为我的应用程序构建
SalesViewController
,它由一个
TableView
组成,显示在日期范围内找到的所有项目。
项目
订单
的子项,它具有
类别
日期
项目ID
项目名称
价格
属性所有
字符串
。 我终于成功地将
itemFetchResultController
的结果正确地划分为几个部分,因为我的
sortDescriptor
错误。在配置
itemFetchResultController
时,我希望使用从已获取的
Item
实体中获取的
category
属性作为填充的
TableView
中显示的部分标题。我的目标是,我不确定是否可能或者如何实现它,在它的部分中每个
itemName
只有一行,但知道在fetch中找到了多少行,并使用它来显示售出的价值。这是我第一次使用
部分
,这让我有点困惑。我试图遵循Apple文档示例代码在tableView的数据源方法中给出了几个错误,您可以通过注释掉的代码看到这些错误。我在stack overflow上找到的所有其他帖子都非常古老,都是在objective c中找到的,所以我没有找到我的疑问的答案。 到目前为止,
TableView
已正确填充,但滚动时第一节标题不会移动

知道是什么引起的吗? 一如既往,非常感谢

下面是我用于
itemFetchResultController
的代码:

lazy var itemFetchedResultController: NSFetchedResultsController<Item> =  {

        // first sortDescriptor filters the date range:  possibly change date from String to dates in both function and  CoreData and use "(date >= %@) AND (date <= %@)" instead of "BEGINSWITH" in predicate
        let itemFetchRequest = NSFetchRequest<Item>(entityName: "Item")
        itemFetchRequest.sortDescriptors = [NSSortDescriptor(key: "category", ascending: true)]
        itemFetchRequest.predicate = NSPredicate(format: "order.user.name == %@", UserDetails.fullName!)
        itemFetchRequest.predicate = NSPredicate(format: "date BEGINSWITH %@", dateToFetch)
        let itemFetchedResultController = NSFetchedResultsController(fetchRequest: itemFetchRequest, managedObjectContext: context, sectionNameKeyPath: "category", cacheName: nil)
        return itemFetchedResultController
    }()

将您的
UITableView
样式设置为grouped,您的all部分将随单元格一起滚动


将您的
UITableView
样式设置为grouped,您的all部分将随单元格一起滚动


非常感谢,就这样。我找它快发疯了。非常感谢,就这样。我找它快发疯了。
func numberOfSections(in tableView: UITableView) -> Int {

        // apple doc : trhrows an error : Initializer for conditional binding must have Optional type, not 'NSFetchedResultsController<Item>'
//        if let frc = itemFetchedResultController {
//            return frc.sections!.count
//        }
//        return 0

            return itemFetchedResultController.sections!.count

    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        guard let sections = self.itemFetchedResultController.sections else {
            print(" Error :no sections in fetchedResultController" )
            return 0
        }
        let sectionInfo = sections[section]
        return  sectionInfo.numberOfObjects

    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "statisticsCell", for: indexPath) as! StatisticsTableViewCell
            cell.idInfoLabel.text = itemFetchedResultController.object(at: indexPath).itemId!
            cell.nameInfoLabel.text = itemFetchedResultController.object(at: indexPath).itemName!

    let item = itemFetchedResultController.object(at: indexPath).itemName!

    let productRequest: NSFetchRequest<Product> = Product.fetchRequest()
    productRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
    productRequest.predicate = NSPredicate(format: "name == %@", item)
    productRequest.fetchLimit = 1
    do {
        let fetch = try context.fetch(productRequest)
        cell.productImageView.image = UIImage(data: (fetch[0].productImage! as Data))
        cell.minimumStockInfoLabel.text = fetch[0].minimumStock
        cell.soldQuantityInfoLabel.text = fetch[0].soldQuantity

    } catch  {
        print("Error in fetching product for cell: \(error)")
    }

    return cell
}

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

//        guard let sections = self.itemFetchedResultController.sections else {
//            print(" Error : no sections in itemsFetchedResultController " )
//            return "empty"
//        }
//        let sectionInfo = sections[section]
//        return sectionInfo.name

        guard let sectionInfo = itemFetchedResultController.sections?[section] else {
            return nil
        }
        return sectionInfo.name

    }

        func sectionIndexTitles(for tableView: UITableView) -> [String]? {
//            if let sectionIndexTitles: FetchedResultController.sectionIndexTitles = self.itemFetchedResultController.sectionIndexTitles {
//                print(" Error : no sections in itemsFetchedResultController " )
//                return [""]
//            }
            return itemFetchedResultController.sectionIndexTitles
        }

    func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int {
        // apple doc : trhrows an error : Initializer for conditional binding must have Optional type, not 'Int'
//        guard let result = itemFetchedResultController.section(forSectionIndexTitle: title, at: index) else {
//            fatalError("Unable to locate section for \(title) at index: \(index)")
//        }
//        return result
       let result = itemFetchedResultController.section(forSectionIndexTitle: title, at: index)
        return result

    }