【Swift 4.0】iOS 11 UICollectionView 长按拖拽删除崩溃的问题
功能
用 UICollectionView 实现两个 cell 之间的位置交互或者拖拽某个位置删除
问题
iOS 11 以上拖拽删除会崩溃,在 iOS 9、10 都没有问题
错误
017-10-11 11:38:02.692004+0800 MOCR[2585:1047221] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempting to invalidate an item at an invalid indexPath: <NSIndexPath: 0x1c442a680> {length = 2, path = 0 - 1} globalIndex: 1 numItems: 1'
*** First throw call stack:
(0x181f3bd38 0x181450528 0x181f3bc0c 0x1828cac24 0x18be1091c 0x18bdd2ab8 0x18b4b74ac 0x18b4b48b8 0x18b569a4c 0x18bdd9e98 0x10275d49c 0x10275d45c 0x102762050 0x181ee3f20 0x181ee1afc 0x181e022d8 0x183c93f84 0x18b3af880 0x1009a753c 0x18192656c)
libc++abi.dylib: terminating with uncaught exception of type NSException
代码
func handleLongGesture ( gesture : UILongPressGestureRecognizer ) { switch ( gesture . state ) { case . began : guard let selectedIndexPath = self . collectionView . indexPathForItem ( at : gesture . location ( in : self . collectionView )) else { break } collectionView . beginInteractiveMovementForItem ( at : selectedIndexPath ) case . changed : collectionView . updateInteractiveMovementTargetPosition ( gesture . location ( in : gesture . view !)) case . ended : self . collectionView . endInteractiveMovement () // 检测是否删除操作,是的话删除数据并调用 reloadData() default : collectionView . cancelInteractiveMovement () } } |
分析
测试发现调用 beginInteractiveMovementForItem 和 endInteractiveMovement 也会触发 reloadData 操作,这样删除前后会调用两次 reloadData,但是 reloadData 又是异步操作,所以就报错了。
解决
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | func handleLongGesture ( gesture : UILongPressGestureRecognizer ) { switch ( gesture . state ) { case . began : guard let selectedIndexPath = self . collectionView . indexPathForItem ( at : gesture . location ( in : self . collectionView )) else { break } collectionView . beginInteractiveMovementForItem ( at : selectedIndexPath ) case . changed : collectionView . updateInteractiveMovementTargetPosition ( gesture . location ( in : gesture . view !)) case . ended : self . collectionView . endInteractiveMovement () DispatchQueue . main . asyncAfter ( deadline : . now () + . milliseconds ( 300 ), execute : { [ weak self ] in // 检测是否删除操作,是的话删除数据并调用 reloadData() }) default : collectionView . cancelInteractiveMovement () } } |
加一个延迟处理就行
本文转自博客园农民伯伯的博客,原文链接:【Swift 4.0】iOS 11 UICollectionView 长按拖拽删除崩溃的问题,如需转载请自行联系原博主。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
《React Native移动开发实战》出版啦
对不起,我来晚了 首先要感谢支持和关注我的朋友,感谢人邮的赵老师,还有公司的领导和同事,他们在我写作的过程中给了很多有用的信息,也给了很多有用的建议,为本书的写作提供了很大帮助。感谢,再次感谢!!! 工作6年多以来,一直想写一本自己的书,一方面是对自己工作经历的一个总结,也是对希望写一本书给曾经的自己一个交代,毕竟30岁的人了,搞不了几年的技术了。 我一直有写博客的习惯,喜欢将自己工作和生活的点滴写成博客,分享给大家。说说我写书的缘由吧,最近几年,特别是15年和16年,我朋友圈的好友陆续出了自己的书,出于“跟风”吧,我也打算写一本,不过当时只是规划,没有具体实施。正好17年的1月份,一个人邮出版社的杨老师在csdn上给我留言,问我有没有兴趣写一本书,我问他写什么呢,他说要不就写React Native吧。说实话,那时候我对React Native并不是很熟悉,只是平时工作之余会学习相关的技术,在那之前,我一直从事的是Android和ios开发工作(搞了差不多6年了),虽然之前对React Native也有一定的了解,但深入还是不够的。于是前两个月我都写的很慢,一方面是公司的原因,一方面...
- 下一篇
【Swift 2.2】iOS开发笔记(三)
1、UITableView 中调用 UIButton 的 setTitle 会闪 滚动列表时比较明显,解决办法:buttonType 改成 custom 即可,但是这样一来 UIButton 的高亮效果也没了,但可以自己手动配置 State Config 2、监听 UITextField 文本改变 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { let text = NSString(string: textField.text!).stringByReplacingCharactersInRange(range, withString: string) } 更好的办法:http://stackoverflow.com/questions/7010547/uitextfield-text-change-event 3、模拟较差的网络 iPhone 设置 >> D...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Windows10,CentOS7,CentOS8安装Nodejs环境
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- 2048小游戏-低调大师作品
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路