我想在回收提醒方面寻求一些帮助。看起来像numberOfRowsInSection,甚至在eventStore.fetchReminders完成之前就被调用了。这是我的代码:
override func viewWillAppear(_ animated: Bool) {
print("****viewWillAppear")
super.viewWillAppear(true)
self.eventStore = EKEventStore()
self.reminders = [EKReminder]()
//Added to initialize
self.reminders.removeAll()
self.eventStore!.requestAccess(to: EKEntityType.reminder, completion:
{(granted, error) in
if granted
{
let predicate = self.eventStore.predicateForReminders(in: nil)
self.eventStore.fetchReminders(matching: predicate, completion: { (reminders: [EKReminder]?) -> Void in
self.reminders = reminders
DispatchQueue.main.async() {
//Added
self.reminders = reminders
self.tableView.reloadData()
}
})
}
else
{
print("The app is not permitted to access reminders, make sure to grant permission in the settings and try again")
}
})
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print("*****numberOfRowsInSection")
print("numberOfRowsInSection reminders \(self.reminders.count)")
return self.reminders.count
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
print("****titleForHeaderInSection")
print("titleForHeaderInSection reminders \(self.reminders.count)")
return "test"
}我试着把它放到viewDidLoad中,但是同样的事情发生了,numberofRowsInSection中的self.reminders.count返回0。我还试图在fetchReminders之外调用requestAccess (因为我认为requestAccess没有被触发),但我最终得到了同样的结果。我做错什么了吗?我真的很感激你的建议!
谢谢!
发布于 2016-11-22 04:18:02
这很正常。UITableViewController试图在显示视图控制器时显示表视图的内容。您应该在self.reminders开始时使用空数组初始化viewDidLoad,这样表视图最初就不会显示结果。
然后,一旦您完成对事件存储的访问,将调用用于重置self.reminders和重新加载表视图的代码。
您应该做的一个关键更改是在self.reminders块中设置DispatchQueue.main.async()。这可以确保数据源在重新加载表之前更新,而不是在手动之前更新。换句话说,将代码更新为:
self.eventStore.fetchReminders(matching: predicate, completion: { (reminders: [EKReminder]?) -> Void in
DispatchQueue.main.async() {
self.reminders = reminders
self.tableView.reloadData()
}
})另一个需要考虑的更改是,最初将self.reminders设置为nil,并让表视图数据源方法将其视为显示一行的信号,其中一行写着“加载”(或类似的内容)。否则,您的用户可能会想知道,他们为什么在一个主要是空白的屏幕上主演了很短的一段时间。
https://stackoverflow.com/questions/40733619
复制相似问题