如何按日期升序快速排序Tableview行

如何解决如何按日期升序快速排序Tableview行

我有eventsTableView ..无论日期是什么,这里所有行都一一添加..但是这里我需要根据日期orderedAscending

显示tableview

,总代码为:

 class EventsViewController: UIViewController {

var eventList : EventsModel? = nil

@IBOutlet weak var eventsTableView: UITableView!

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    getAllEventsList()
}


func getAllEventsList() {
  //URLs and  code..
    
   do {
           let jsonObject  = try JSONSerialization.jsonObject(with: data!,options: .mutableLeaves) as! [String :AnyObject]
            print("publish event \(jsonObject)")
            self.eventList = EventsModel.init(fromDictionary: jsonObject)
            DispatchQueue.main.async {
            if self.eventList?.events.count != 0 {
             DispatchQueue.main.async {
                            
           self.eventsTableView.reloadData()
             }
              }
             else {
                        
                   DispatchQueue.main.async {
                  Constants.showAlertView(alertViewTitle: "",Message: "No Events \(self.eventType)",on: self)
                    self.eventList?.events.removeAll()
                    self.eventsTableView.reloadData()
                        }
                    }
               
    dataTask.resume()
        
}
    
}
extension EventsViewController : UITableViewDelegate,UITableViewDataSource {

func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
    
    return eventList?.events.count ?? 0
}
func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    let cell: EventsTableViewCell = tableView.dequeueReusableCell(withIdentifier: "EventsTableViewCell") as! EventsTableViewCell
    
    let event     = eventList!.events[indexPath.row]
    
    if event.isAllDayEvent == true{
        
      cell.eventDate.text = event.eventDate
      cell.nameLbl.text  = event.eventName

    }
    else{
        cell.cancelLbl.text = ""
        cell.nameLbl.text  = event.eventName
        cell.eventDate.text = event.eventDate 
    return cell
}   
}

这是EventsModel代码: 就像我们创建的模型一样。.如何从此处排序日期

class EventsModel : NSObject,NSCoding {

 var events : [EventsModelEvent]!

init(fromDictionary dictionary: [String:Any]){
events = [EventsModelEvent]()
if let eventsArray = dictionary["Events"] as? [[String:Any]]{
    for dic in eventsArray{
        let value = EventsModelEvent(fromDictionary: dic)
        events.append(value)
    }
}
}

 func toDictionary() -> [String:Any]
 {
var dictionary = [String:Any]()
if events != nil{
    var dictionaryElements = [[String:Any]]()
    for eventsElement in events {
        dictionaryElements.append(eventsElement.toDictionary())
    }
    dictionary["events"] = dictionaryElements
}
return dictionary
}

这是EventsModelEvent

class EventsModelEvent : NSObject,NSCoding {

 var eventName : String!
 var eventDate: string!
 

 init(fromDictionary dictionary: [String:Any]){
 eventName = dictionary["eventName"] as? String
 eventDate = dictionary["eventDate"] as? String
}
}


 

请帮助我以日期升序显示tableview行。

解决方法

在重新加载tableview之前,您需要根据日期对事件数组进行排序。 您面临的挑战是什么?

,

一种排序方式:

func sort() {
    eventList!.events.sort(by: {$0.eventDate < $1.eventDate})
    eventsTableView.reloadData()
}
,

这是一种可用于按日期对事件进行排序的方法。我已经采用了很多代码,只专注于如何对自定义类型(如Event)进行排序。您应该做的第一件事就是遵守您的Comparable类中的EventsModelEvent协议,如下所示(我对CustomStringConvertible的遵守只是为了打印出结果):

class Event: Comparable,CustomStringConvertible {

它将引发错误,并说此类不符合Comparable且此类不符合Equatable,是否要添加协议存根?单击“是”,它将在类中添加小于()。

static func < (lhs: Test,rhs: Test) -> Bool {
        (code)
    }
    
    static func == (lhs: Test,rhs: Test) -> Bool {
        (code)
    }
static func > (lhs: Event,rhs: Event) -> Bool {
        (code)
    }

您当前的日期类型为String,在对日期进行排序时将不起作用。要解决此问题,请在您的EventsModelEvent类中添加一个方法来格式化日期,如下所示。实现该方法的方式将根据字符串中日期的显示方式而有所不同,但这是一个示例:

private func formatDate() -> Date? {
        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .medium //Format is Aug 26,2020
        return dateFormatter.date(from: self.date)
    } 

这将在您正确指定日期格式的情况下,从date属性中创建一个可选日期。现在,您说过要根据日期比较事件,特别是按升序排序。在比较方法内部,您想要返回左侧日期(las)和右侧日期(res)的比较,如下所示。

static func < (lhs: Event,rhs: Event) -> Bool {
        return lhs.formatDate()! < rhs.formatDate()!
    }
static func > (lhs: Event,rhs: Event) -> Bool {
        return lhs.formatDate()! > rhs.formatDate()!
    }
static func == (lhs: Event,rhs: Event) -> Bool {
        return lhs.name == rhs.name
    }

请注意,在此示例中,我强制打开了包装,因此,如果formatDate()返回的日期为零,则程序将崩溃。现在,您想将方法添加到EventsModel中,以按日期升序对Array进行排序,并可以使用sorted(by:)方法。该实现如下。

func sortByDate() -> [Event] {
        return events.sorted(by: >)
    } 

现在,如果我像下面那样创建Event的数组,则可以对其进行排序。

let events = Events(events: [Event(name: "one",date: "Jan 1,1993"),Event(name: "two",date: "Dec 31,2016"),Event(name: "three",date: "Aug 16,2020")])
print(events)

印刷品[1993年1月1日,两次,2016年12月31日,2020年8月16日,三]

let sortedEvents = events.sortByDate()
print(sortedEvents)

印刷品[2020年8月16日,三,2016年12月31日,两次,1993年1月1日,一]

或更简洁地说:

let eventsSorted = Events(events: [Event(name: "one",2020")]).sortByDate()
print(eventsSorted)

印刷品[2020年8月16日,三,2016年12月31日,两个,1993年1月1日,一个]

所有课程:

class Events: CustomStringConvertible {
    var events: [Event]
    var description: String {
        return events.description
    }
    
    func sortByDate() -> [Event] {
        return events.sorted(by: >)
    }
    
    init(events: [Event]) {
        self.events = events
    }
}

class Event: Comparable,CustomStringConvertible {
    var description: String {
        return "\(name),\(date)"
    }

    var name: String
    var date: String
    
    private func formatDate() -> Date? {
        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .medium
        return dateFormatter.date(from: self.date)
    }
    
    static func < (lhs: Event,rhs: Event) -> Bool {
        return lhs.formatDate()! < rhs.formatDate()!
    }
    
    static func > (lhs: Event,rhs: Event) -> Bool {
        return lhs.formatDate()! > rhs.formatDate()!
    }
    
    static func == (lhs: Event,rhs: Event) -> Bool {
        return lhs.name == rhs.name
    }
    
    init(name: String,date: String) {
        self.name = name
        self.date = date
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?