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!)
将cellForRowAt
和configureCell
替换为(我将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 中访问一对多关系