在表格视图中重新排序按日期排序的单元格项目

Posted

技术标签:

【中文标题】在表格视图中重新排序按日期排序的单元格项目【英文标题】:ReOrdering Cell Items sorted by Date in a Table View 【发布时间】:2016-02-02 14:38:03 【问题描述】:

我有以下代码,通过按住然后将项目移动到不同位置来重新排序表格视图中的项目,如附图所示。

该代码非常适用于按索引路径排序的对象。

我的模型已经改变,现在按日期订购商品。关于如何修改代码以更改以将日期重新分配给交换的单元格的任何想法,以便将它们保存在核心数据中。

//MARK : - Cell Re-Ordering
    struct Drag 
        static var placeholderView: UIView!
        static var sourceIndexPath: NSIndexPath!
        static var sourceDate: NSDate!
    

func handleLongPress(gesture: UILongPressGestureRecognizer) 

    let point = gesture.locationInView(tableView)
    let indexPath = tableView.indexPathForRowAtPoint(point)

    switch gesture.state 
    case .Began:
        if let indexPath = indexPath 
            let cell = tableView.cellForRowAtIndexPath(indexPath)!
            Drag.sourceIndexPath = indexPath

            var center = cell.center
            Drag.placeholderView = placeholderFromView(cell)
            Drag.placeholderView.center = center
            Drag.placeholderView.alpha = 0

            tableView.addSubview(Drag.placeholderView)

            UIView.animateWithDuration(0.25, animations: 
                center.y = point.y
                Drag.placeholderView.center = center
                Drag.placeholderView.transform = CGAffineTransformMakeScale(1.05, 1.05)
                Drag.placeholderView.alpha = 0.95

                cell.alpha = 0
                , completion:  (_) in
                    cell.hidden = true
            )

        
    case .Changed:
        guard let indexPath = indexPath else 
            return
        

        var center = Drag.placeholderView.center
        center.y = point.y
        Drag.placeholderView.center = center

        if indexPath != Drag.sourceIndexPath 

            /////////////// Swap the Index Path ///////////////
            swap(&self.weekDayModel.exerciseItems[indexPath.row], &self.weekDayModel.exerciseItems[Drag.sourceIndexPath.row]) //Previous Model Swapping
            tableView.moveRowAtIndexPath(Drag.sourceIndexPath, toIndexPath: indexPath)
            Drag.sourceIndexPath = indexPath
        
    default:
        if let cell = tableView.cellForRowAtIndexPath(Drag.sourceIndexPath) 
            cell.hidden = false
            cell.alpha = 0

            UIView.animateWithDuration(0.25, animations: 
                Drag.placeholderView.center = cell.center
                Drag.placeholderView.transform = CGAffineTransformIdentity
                Drag.placeholderView.alpha = 0
                cell.alpha = 1
                , completion:  (_) in
                    Drag.sourceIndexPath = nil
                    Drag.placeholderView.removeFromSuperview()
                    Drag.placeholderView = nil
            )
        
    


func placeholderFromView(view: UIView) -> UIView 

    UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, 0.0)
    view.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    let image = UIGraphicsGetImageFromCurrentImageContext() as UIImage
    UIGraphicsEndImageContext()

    let snapshotView : UIView = UIImageView(image: image)
    snapshotView.layer.masksToBounds = false
    snapshotView.layer.cornerRadius = 0.0
    snapshotView.layer.shadowOffset = CGSizeMake(-5.0, 0.0)
    snapshotView.layer.shadowRadius = 5.0
    snapshotView.layer.shadowOpacity = 0.4
    return snapshotView

我的核心数据模型:

import CoreData
@objc(graduationModel)
class graduationModel: NSManagedObject 

    // Insert code here to add functionality to your managed object subclass


extension graduationModel 

    @NSManaged var Name: String?
    @NSManaged var graduation: String?

    @NSManaged var date: NSDate?


非常感谢任何想法。

【问题讨论】:

好的..您必须在数据库中添加一个属性,例如每个项目/行的排名/顺序。一旦您要使用任何单元格(行)移动/更改,然后还要替换它们之间的相互排名。 @Gagan_ios 可以。我只是不确定如何在创建下一个对象时跟踪排名/顺序属性。在添加新项目时,我必须知道最后创建的排名/订单属性,以防止订单/排名属性发生冲突。除非您知道解决该问题的更好方法,否则可能比使用日期更难。 ;) 有道理。 @SwiftArchitect。您的建议是否与之前的评论一致 - 为模型中的每个实体添加排名属性还是您有其他建议? 【参考方案1】:

对核心数据对象进行排序

Core Data 产生的是NSSet,即无序对象。我想以速度为代价。您只能按您提供给您的属性进行排序。

更改模型并在 UI 中体现新的顺序,而不是更改 UI 并希望传播到 Core Data。使用 NSFetchResultController 将处理所有 UI 刷新:您需要注意的是您的核心数据完整性。

型号

您只能使用与您的对象关联的属性进行排序。考虑使用增量唯一标识符,创建NSDate,修改NSDate,所有这些都将有助于您以后对内容进行排序。

用户界面

利用NSFetchedResultsController 大大减少您的工作量。


使用正确模型和NSFetchedResultsControllerhere进行排序的示例。

【讨论】:

以上是关于在表格视图中重新排序按日期排序的单元格项目的主要内容,如果未能解决你的问题,请参考以下文章

如何按字母顺序对表格视图单元格进行排序

如何使用自定义按钮重新排序表格视图单元格,但不使用 ios 中的移动编辑图标

重新排列表格视图单元格后如何更新核心数据记录

NSSortDescriptor 在查看详细视图并返回后按字母顺序重新排序单元格

重新排序单元格时如何在 UITableViewcell 内容视图中添加图像?

重新排序单元格后如何更改获取结果控制器数组中对象的顺序