Swift:使用 sectionNameKeyPath 的单元格的 indexPath

Posted

技术标签:

【中文标题】Swift:使用 sectionNameKeyPath 的单元格的 indexPath【英文标题】:Swift: indexPath of cells using sectionNameKeyPath 【发布时间】:2018-05-05 14:54:39 【问题描述】:

目前,我刚刚开始在 Swift 的核心数据中使用 NSFetchedResultsController 中的 sectionNameKeyPath /

最初,我不知道如何将不同的单元格分成各自的日期。但是现在我已经将单元格分成了各自的日期,它们的 indexPath 都搞砸了,因为当我执行 segue 以导致第二个 viewController 时,值被搞砸了。

例如

第二个 $42.5 -> $9.0, 10 美元 -> 9.0 美元, $72.0 -> $42.5, $0.0 -> $99.0 和 $9.0 -> $10.0

如果有人能教我如何在从 coreData 获取后正确调整 indexPath 以适应每个部分,那将非常有帮助。

    func initialFetch() 
    let fetchRequest: NSFetchRequest<Item> = Item.fetchRequest()
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "dates", ascending: false)] //sorting according to date


    let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: "dates", cacheName: nil)

    controller.delegate = self

    self.controller = controller
    do 
        try controller.performFetch()
     catch 
        fatalError("Failed to fetch entities: \(error)")
    

这是我获取数据的代码

附:我认为这可能与我的“didSelectRowAt”有关

    func tableView(_ tableView: UITableView, didSelectRowAt      indexPath: IndexPath) 
    if let objs = controller.fetchedObjects, objs.count > 0 
        let item = objs[indexPath.row]
        performSegue(withIdentifier: "TrackerVC", sender: item)
    

【问题讨论】:

好的,我的问题已经解决了,答案如下 【参考方案1】:

您的排序描述符需要包括作为部分的字段和部分中的行,因此将价格属性的排序描述符添加到现有的。

【讨论】:

我尝试添加这个,但它仍然不起作用'' fetchRequest.sortDescriptors = [NSSortDescriptor(key: "dailySpending", ascending: false)] '' @Kendrew 添加,而不是替换。 fetchRequest.sortDescriptors = [NSSortDescriptor(key: "dates", ascending: false), NSSortDescriptor(key: "dailySpending", ascending: false)] 嗨,感谢您的回复。我以前也尝试过,它有助于按支出对我的行进行排序,但不能解决上述问题【参考方案2】:

好的,经过数周的反复试验和研究,我终于找到了最简单的解决方案。

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 

    let item = controller.object(at: indexPath)
    performSegue(withIdentifier: "TrackerVC", sender: item)


override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier == "TrackerVC" 
        if let destination = segue.destination as? TrackerVC 
            if let item = sender as? Item 
                destination.itemToEdit = item
            
        
    

所以这是我发现的根据每个部分中的行执行 segue 的最简单的解决方案

【讨论】:

以上是关于Swift:使用 sectionNameKeyPath 的单元格的 indexPath的主要内容,如果未能解决你的问题,请参考以下文章

Swift 类使用 Objective-C 类使用 Swift 类

swift 使用swift获取数据使用情况

我可以在 Swift 3 项目中使用 Swift 2.3 框架吗?

Swift初窥--使用Swift实现TableView

Swift : 使用多个 swift 文件或仅使用一个 viewController?保持清洁

如何使用 Swift Package Manager `swift build` 命令构建 Swift Package 的优化版本