首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >swift 3在视图出现前运行编号

swift 3在视图出现前运行编号
EN

Stack Overflow用户
提问于 2016-11-22 04:09:37
回答 1查看 474关注 0票数 0

我想在回收提醒方面寻求一些帮助。看起来像numberOfRowsInSection,甚至在eventStore.fetchReminders完成之前就被调用了。这是我的代码:

代码语言:javascript
复制
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没有被触发),但我最终得到了同样的结果。我做错什么了吗?我真的很感激你的建议!

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-22 04:18:02

这很正常。UITableViewController试图在显示视图控制器时显示表视图的内容。您应该在self.reminders开始时使用空数组初始化viewDidLoad,这样表视图最初就不会显示结果。

然后,一旦您完成对事件存储的访问,将调用用于重置self.reminders和重新加载表视图的代码。

您应该做的一个关键更改是在self.reminders块中设置DispatchQueue.main.async()。这可以确保数据源在重新加载表之前更新,而不是在手动之前更新。换句话说,将代码更新为:

代码语言:javascript
复制
self.eventStore.fetchReminders(matching: predicate, completion: { (reminders: [EKReminder]?) -> Void in
    DispatchQueue.main.async() {
        self.reminders = reminders
        self.tableView.reloadData()
    }
})

另一个需要考虑的更改是,最初将self.reminders设置为nil,并让表视图数据源方法将其视为显示一行的信号,其中一行写着“加载”(或类似的内容)。否则,您的用户可能会想知道,他们为什么在一个主要是空白的屏幕上主演了很短的一段时间。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40733619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档