Swift - 一对多排序

Posted

技术标签:

【中文标题】Swift - 一对多排序【英文标题】:Swift - Sorting one to many 【发布时间】:2017-07-12 15:14:30 【问题描述】:

我有两个实体:

游泳池 参数

swimmingPool 与参数有关系(每个池可以有多个参数,因此是一对多的关系)。

在我的主视图控制器中,我正在为池获取数据。 现在我将数据传递给第二个视图控制器,该控制器包含与特定池相关的所有操作的列表。 从这里我将数据发送到第三个视图控制器,其中列出了与池相关的所有参数。

我能够获取数据并显示它们,但我似乎无法对它们进行排序。

这是在我的主 VC 中获取池的代码:

func attemptFetch() 

    let fetchRequest: NSFetchRequest<SwimminPool> = SwimminPool.fetchRequest()
    let dataSort = NSSortDescriptor(key: "poolCreatedAt", ascending: false)
    fetchRequest.sortDescriptors = [dataSort]


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

    controller.delegate = self
    self.controller = controller

    do 
        try controller.performFetch()
     catch 
        let error = error as NSError
        print("\(error.debugDescription)")
    


传递数据的segue:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
     if segue.identifier == "MyParams" 
        if let destination = segue.destination as? MyParamsVC 
            destination.swimmingPool = swimmingPoolHome
        
    

这是在第三个控制器中配置单元格的代码:

var swimmingPool: SwimmingPool! // data received from the segue

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "ParamCell", for: indexPath) as! ParamCell
    configureCell(cell: cell, indexPath: indexPath as NSIndexPath)
    return cell

 func configureCell(cell: ParamCell, indexPath: NSIndexPath) 
    let param = swimmingPool.parameters?.allObjects[indexPath.row]
    cell.configureCell(parameter: param as! Parameter)

最后是我的 paramCell:

lass ParamCell: UITableViewCell 

@IBOutlet weak var paramCreatedAt: UILabel!
@IBOutlet weak var noteLbl: UILabel!

func configureCell(parameter: Parameter) 
    let formatter = DateFormatter()
    formatter.dateFormat = "dd-MMMM-yyyy, HH:mm:ss"
    let dateString = formatter.string(from: parameter.createdAt!).capitalized
    paramCreatedAt.text = dateString
    noteLbl.text = parameter.paramNotes

关于如何按日期对数据进行排序有什么想法吗?

【问题讨论】:

【参考方案1】:

MyParamsVC中创建一个单独的数据源数组:

var parameters = [Parameter]()

didSet 观察者添加到swimmingPool,它会获取Parameter 实例并对其进行排序(将createdAt 更改为您想要的属性)

var swimmingPool: SwimmingPool!   // data received from the segue
    didSet 
        parameters = (swimmingPool.parameters?.allObjects as! [Parameter]).sorted(by: $0.createdAt! < $1.createdAt!)
    

cellForRowAtconfigureCell 替换为(我将NSIndexPath 更改为Swift 3 IndexPath

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "ParamCell", for: indexPath) as! ParamCell
    configureCell(cell: cell, indexPath: indexPath)
    return cell


func configureCell(cell: ParamCell, indexPath: IndexPath) 
    let param = parameters[indexPath.row]
    cell.configureCell(parameter: param)

【讨论】:

感谢您的回答...一如既往,您非常友善....我已经完成了您建议的一切...但是我收到错误“索引超出范围”我的获取请求是在我的主 VC 中,所以在我的参数 VC 中,我没有获取请求,并且没有调用 func controllerWillChangeContent 和 controllerDidChangeContent ......这可能是问题吗? 我实际上还有一个意外发现 nil 的错误,同时在 dateString 上展开 Optional 值... 您不需要在MyParamsVC 中获取数据。只需在 segue 中传递 swimmingPool 实例并将其分配给 swimmingPool 属性。你也不需要 fetchedresultscontroller。 numberOfRows 返回什么?你必须返回parameters.count swimminPool.parameters?.count 我会尝试只返回 parameters.count

以上是关于Swift - 一对多排序的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Swift 在 CoreData 中访问一对多关系

核心数据一对多插入与现有关系swift

一对多关系CoreData Swift

Swift 2.0 一对多的关系——仍然是 NSOrderedSet?

Restkit, Swift, Core data 一对多

Swift 2:使用一对多条件保存 coredata