如何解决如何按日期升序快速排序Tableview行
我有eventsTableView ..无论日期是什么,这里所有行都一一添加..但是这里我需要根据日期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
}
}
请帮助我以日期升序显示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
}
}