2016-11-22 79 views
0

形势排序最倒序日期在顶部的TableView

我有存储在单元安排本地通知,包含标题,日期,UUID和心情的tableview。他们从用户选择并且完美地工作的那一天开始每周重复一次。我已成功排序的细胞,从而使最下行(最快)通知是在表视图的顶部通过这行代码在refreshList()

dqItems.sort(by: {$0.date < $1.date}) 

问题

然而,当通知已被解雇并且已逾期,通过if (dqItem.isOverdue)函数将7天添加到其日期。这工作 - 7天添加到日期。但是tableview并没有对这些单元格重新排序 - 已经重新安排了7天的通知单元格仍然处于顶部!尽管有其他通知预定了更多的降序日期。 (见图像)

这是非常令人沮丧的,我无法设法找到解决方案。这里有一个Table View Controller文件的片段。

//Outlets 
var dqItems: [DQItem] = [] 
var MoodString = String() 

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

func refreshList() { 

    dqItems = DQList.sharedInstance.allItems() 

     dqItems.sort(by: {$0.date < $1.date}) 

    tableView.reloadData() 
} 

override func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return dqItems.count 
} 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "dqCell", for: indexPath) // retrieve the prototype cell (subtitle style) 
    var dqItem = dqItems[(indexPath as NSIndexPath).row] as DQItem 
    cell.textLabel?.text = dqItem.title as String! 

    if (dqItem.isOverdue) 
    { // the current time is later than the to-do item's date 

     let newDate = Calendar.current.date(byAdding: .day, value: 7, to: dqItem.date)! 
     dqItem.date = newDate 
     dateFormatter.dateFormat = "EEEE's' 'at' HH:mm" 
     print("newdate", newDate) //seven days is added! 
     print("dqItem.d", dqItem.date) //same here 

     viewDidAppear(true) //reload the view to re-sort the cells??? = not working 

    } 

    cell.detailTextLabel?.text = dateFormatter.string(from: dqItem.date as Date) 

    return cell 
}//End of cellforrowatindexPath 

DQItem,其中结构是。

import UIKit 

struct DQItem { 

    var title: String 
    var date: Date 
    var UUID: String 
    var mood: String 

init(date: Date, title: String, UUID: String, mood: String) { 

    self.date = date 
    self.title = title 
    self.UUID = UUID 
    self.mood = mood 

} 

//Overdue function 
var isOverdue: Bool { 

    return (Date().compare(self.date) == .orderedDescending) // date is earlier than current date 
} 



} 

感谢所有帮助,试图解决这个愚蠢的问题!

Example: "Today" comes after "Next Thursday" despite the fact it's more descending

回答

1

别叫viewDidAppear。该方法应该只能由UIKit调用。只需调用你自己的刷新代码。

(即使调用视图状态的方法是一个好主意,你会打电话,因为你实现viewWillAppear做你的初始刷新错了。)

编辑: 对于如何改变你的表中的问题当表正在更新时排序,您需要等到当前更新完成。一种方法是将下一个重新加载请求提交给主队列。由于主队列是串行的,因此会延迟它直到当前工作结束。

尝试将表重新排序到它自己的方法......

func orderTable() { 
    dqItems.sort(by: {$0.date < $1.date}) 
    tableView.reloadData() 
} 

...然后通过GCD调用它,而不是调用视图的生命周期方法。

DispatchQueue.main.async { 
    orderTable() 
} 

这是简单的版本。如果您希望提高效率,可以考虑确保orderTable调用仅在每次重新加载时发生一次。

+0

试图将dqItems.sort(通过:{$ 0.date <$ 1.date})添加到函数中,而不是viewWillAppear - 无变化。请参阅我对问题的更新,以更清楚地解释问题。谢谢@philipMills – Mate

+0

你也叫'reloadData'吗? –

+0

是的,但是它创建了函数的循环,然后...这证实了代码未能使用新的7天+ dqItem.Date并替换已经被触发的旧代码的事实。有没有办法将过期的'Table View Cell'发送到'Table View'的底部?这也可以解决我的问题。 @philipMills – Mate