- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
UITableView
意外反弹 beginUpdates()
/endUpdates()
/performBatchUpdates()
使用 NSFetchedResultsController
和 CoreData 当行数填满 View 时。重现它非常简单。- 从主从应用程序模板(使用 CoreData)创建一个新项目。- 在 Storyboard 中,删除“showDetail”转场。 (我们不需要详细 View )- 在 MasterViewController 中,将 segue func prepare()
替换为:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let event = fetchedResultsController.object(at: indexPath)
let timestamp = event.timestamp
event.timestamp = timestamp // The idea is to simply update the Event entity.
}
启动应用程序(在 iOS 设备或模拟器中),并添加足够的行来填充 View (在 iPhone SE 中,它有 11 行)。向下 ScrollView ,然后选择任意行。 View 将快速上下弹跳。这是错误还是代码有问题?
最佳答案
好的,我可能找到了解决方案,请告诉我你们的想法。这个想法是在 performBatchUpdates
中处理 insert/delete/move
并将 update
排除在外。所以我创建了这个枚举和属性:
enum FetchedResultsChange<Object> {
case insert(IndexPath)
case delete(IndexPath)
case move(IndexPath, IndexPath, Object)
}
var fetchedResultsChanges: [FetchedResultsChange<Event>] = []
controllerWillChangeContent
变为空:
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {}
didChange
变成:
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
switch type {
case .insert:
self.fetchedResultsChanges.append(.insert(newIndexPath!))
case .delete:
self.fetchedResultsChanges.append(.delete(indexPath!))
case .update:
configureCell(tableView.cellForRow(at: indexPath!)!, withEvent: anObject as! Event) // So this stays untouched.
case .move:
self.fetchedResultsChanges.append(.move(indexPath!, newIndexPath!, anObject as! Event))
}
}
controllerDidChangeContent
变成:
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
guard self.fetchedResultsChanges.count > 0 else { return }
tableView.performBatchUpdates({
repeat {
let change = self.fetchedResultsChanges.removeFirst()
switch change {
case .insert(let newIndexPath):
tableView.insertRows(at: [newIndexPath], with: .fade)
case .delete(let indexPath):
tableView.deleteRows(at: [indexPath], with: .fade)
case .move(let indexPath, let newIndexPath, let event):
configureCell(tableView.cellForRow(at: indexPath)!, withEvent: event)
tableView.moveRow(at: indexPath, to: newIndexPath)
}
} while self.fetchedResultsChanges.count > 0
}, completion: nil)
}
那你怎么看?
关于ios - UITableView 使用 NSFetchedResultsController 和 CoreData 意外反弹到 beginUpdates()/endUpdates()/performBatchUpdates(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50981504/
如果停止 ScrollView 中两个元素之间的滚动,是否有办法使 ScrollView 弹起并稳定? 最佳答案 是的,它叫做Pagination,您基本上需要设置contentSize,然后在中设置
我有一个 UIImageView,它应该从顶部滑入 View ,然后当它停止时它应该制作一个弹跳动画。 我正在像这样设置 y.position 变化的动画: [UIView animateW
我在 java android studio 中使用 libgdx。我才刚刚开始。我正在使用安卓手机。我没有使用任何相机。我想要的只是屏幕所有四个边的 Sprite 反弹而无需点击。我尝试了很多我认为
文本以编程方式添加到 UILabel。随着添加更多文本,文本换行并增加标签的高度。 问题是,当文本在一行的末尾换行时,整个标签将跳起 1 行的高度并自行动画回到正确的位置。最终结果很好,但是你如何摆脱
从 iPhone 上的 UIAlertView 模仿弹跳动画的最佳方法是什么?是否有一些内置机制? UIAlertView 本身不能满足我的需要。 我研究了动画曲线,但据我所知,它们提供的唯一曲线是缓
为此搜索了很多,但还没有找到合适的解决方案。 是否可以禁用 UIPageViewController 的反弹效果并仍然使用 UIPageViewControllerTransitionStyleScr
我有一个 ScrollView ,它充当横幅,其中有 15 个 ImageView 作为 subview (水平滚动)。我这样添加 subview : for (int i = 0; i < feat
我希望如果用户滑动的宽度小于按钮宽度的一半,那么它会弹回并且不显示任何按钮,但是如果用户滑动的宽度超过按钮宽度的一半,那么单元格就会弹回正确的位置。 这就是我目前所拥有的,可以左右滑动。 privat
我使用 jQuery Waypoints 库将菜单栏容器的位置从静态修改为固定。当浏览器窗口向下滚动到菜单栏时,该栏固定在窗口的顶部。 当缓慢滚动到/经过航路点时,状态变化似乎很顺利,但当我以正常速度
我在 xib 中为我的 customCell 使用 autoLayout,因为我想根据文本为行设置可变高度。 现在在我的 VC.m 中 我正在使用这些代码行 - (void)viewdidLoad {
我已经尝试了很多方法来解决这个问题,浪费了整整一周,没有解决。 我有两个 AWS 账户。一个帐户有 example.com 通过 SMTP 发送 SES 电子邮件。原始 mime 文件包括来源:bou
我希望让球的弹跳变得逼真。有时它会反弹,顶点会开始下降,然后再次撞击地面并反弹得更高。当它撞到墙壁时也会发生同样的情况,就好像墙壁违背我的意愿对球施加了一个力(除了 y 方向默认设置为 9.8 的重力
正在寻求有关如何创建执行弹跳的自定义 SKAction( Sprite 套件)的帮助? 基本上,想要将 Sprite 从顶部屏幕拖放到底部(Y 轴)并让它执行快速衰减反弹(仅在 Y 轴上下)。 注意:
我是 Core Animation 的新手,也是 RubyMotion 的新手(自 1 月以来一直在 Xcode 中使用 Obj-C)。我需要 AppLabel(它的 png 在名为 AppAppea
我正在尝试将 vector 拆分为 n 个部分。我检查了以下解决方案 How to split a vector into n "almost equal" parts 我根据这个评论得出了以下代码:
我是一名优秀的程序员,十分优秀!