【问题标题】:How to SORT Tableview rows according to Date Ascending order in swift如何在swift中根据日期升序对Tableview行进行排序
【发布时间】:2020-08-26 17:22:01
【问题描述】:

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

总代码为:

 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
}
}


 

请帮我以日期升序显示表格视图行。

【问题讨论】:

  • 什么是EventsModel?它是结构还是类? events 是什么? eventDate的格式是什么?您需要按日期sort 事件数组。解决方案取决于这些问题的答案。
  • @vadian 谢谢.. 用EventsModel EventsModelEvent 编辑了我的帖子
  • @vadian.. 如何对EventsModel 中的日期进行排序
  • 您是否要按日期对EventsModelEvent 进行排序?如果是这样,它将需要符合 Comparable 协议,以便 Swift 知道如何对其进行排序。这可能意味着您需要将日期属性从String 转换为Date,至少暂时用于排序,因此它会按照您需要的方式进行排序。

标签: swift date uitableview


【解决方案1】:

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

【讨论】:

  • 我已经用模型编辑了我的帖子..请看一下..如何从模型中排序日期
【解决方案2】:

一种排序方式:

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

【讨论】:

    【解决方案3】:

    您可以使用以下方法按日期对事件进行排序。我已经使用了很多代码来专注于如何对Event 之类的自定义类型进行排序。您应该做的第一件事是遵守EventsModelEvent 类中的Comparable 协议,如下所示(我对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)
        } 
    

    假设您已正确指定日期格式,这将从您的日期属性创建一个可选日期。现在,您说您希望根据日期比较事件,特别是按升序排序。在比较方法中,您希望返回左侧日期 (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 以按日期按升序对数组进行排序,并且可以使用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", date: "Jan 1, 1993"), Event(name: "two", date: "Dec 31, 2016"), Event(name: "three", date: "Aug 16, 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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 2023-04-06
      • 2017-05-12
      相关资源
      最近更新 更多