gpt4 book ai didi

ios - UITableView - 你如何重新加载全新的数据?

转载 作者:行者123 更新时间:2023-11-29 02:30:51 25 4
gpt4 key购买 nike

我有一个显示搜索输出的表格 View 。当我更新它以显示完全不同的搜索的输出时,如果旧的结果集更长,那么旧的单元格仍然低于新的结果。

例如,如果我的第一个结果是:

[Sam,
Joe,
Sally,
Betty,
Bob]

然后我有五个单元格,每个结果一个,正如预期的那样。如果我的第二组结果很短,就说

[Smith]

那么我现在有五个单元(Smith、Joe、Sally、Betty 和 Bob),而预计只有一个(Smith)。

这是我重新加载的方式:

results = getResults()
tableView.reloadData()

这是我获取单元格数量的方法:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if results != nil {
println("Table has \(results!.count) rows.")
return results!.count
}
println("Table is empty.")
return 0
}

打印出“Table has 1 rows”。正如预期的那样,但四行旧行仍然存在。

现在,我可以在重新加载之前删除它们,或者删除整个部分,但是有更好的方法来实现这一点吗?我以为 reloadData 会重新加载所有内容。


附加信息

这是请求的 cellForRowAtIndexPath:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("SearchEventsCell", forIndexPath: indexPath) as SearchEventsCell
if results != nil && eventStore != nil && results!.count >= indexPath.row {
let event = results![indexPath.row] as EKEvent
cell.configureCellWithEvent(event)
}
else {
println("Couldn't dequeue the cell")
}
return cell
}

为了证明我们有正确的行数,我在 reloadData() 之前放入了 println:

println("We're about to reload the table view, we have \(numberOfSectionsInTableView(tableView)) sections and \(tableView(tableView, numberOfRowsInSection:0)) rows in section 0")
tableView.reloadData()

哪些输出

Table has 1 rows.
We're about to reload the table view, we have 1 sections and 1 rows in sections 0
Table has 1 rows.

理应如此。

我注意到了其他一些事情,这肯定是相关的 - 在我尝试滚动之前,表格根本不会更新。我缺少什么?我知道 reloadData 已被调用,因为 println 正在 numberOfRowsInSection 中被调用。


更新

触发更新的textFieldShouldReturn方法包含以下代码:

eventStore.requestAccessToEntityType(EKEntityTypeEvent,
{ accessGranted, error in
if accessGranted {
if let searchEventsController = self.searchEventsController {
searchEventsController.search(self.searchTextField.text)
}
}
else {
self.accessDenied()
}
}
)

这似乎很可能是罪魁祸首。有没有更好的方法来检查权限?我将其包含在那里,以便如果用户曾经不允许它,下次他们尝试使用它时会再次询问,而不仅仅是失败。

最佳答案

问题确实是由于 eventStore.requestAccessToEntityType 调用导致 reloadData 在另一个线程中发生。

有两种解决方案:

1) 在应用程序加载时执行一次权限检查,而不是按照 Paulw11 的建议每次访问 EventStore 时执行一次权限检查。这意味着对于大多数应用程序来说只有一个线程。

2)使用以下代码在主线程执行reloadData:

dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}

按照almas的建议。

更新:我刚刚检查过,如果您撤销应用程序访问日历的权限,那么它不会再次询问用户,它只是拒绝访问,因此没有理由保留 eventStore.requestAccessToEntityType 在哪里是的。

关于ios - UITableView - 你如何重新加载全新的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26896908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com