【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(gestureUILongPressGestureRecognizer) {

 

    switch(gesture.state) {

 

    case .began:

        guard let selectedIndexPath self.collectionView.indexPathForItem(atgesture.location(inself.collectionView)) else {

            break

        }

        collectionView.beginInteractiveMovementForItem(atselectedIndexPath)

    case .changed:

        collectionView.updateInteractiveMovementTargetPosition(gesture.location(ingesture.view!))

    case .ended:

        self.collectionView.endInteractiveMovement()

        DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(300), execute: { [weak selfin

            // 检测是否删除操作,是的话删除数据并调用 reloadData()

        })

    default:

        collectionView.cancelInteractiveMovement()

    }

}

    加一个延迟处理就行

本文转自博客园农民伯伯的博客,原文链接:【Swift 4.0】iOS 11 UICollectionView 长按拖拽删除崩溃的问题,如需转载请自行联系原博主。

时间: 2017-12-04
Tags: ios, exception, swift, view

【Swift 4.0】iOS 11 UICollectionView 长按拖拽删除崩溃的问题的相关文章

android RecyclerView侧滑菜单,滑动删除,长按拖拽,下拉刷新上拉加载

本文介绍的库中的侧滑效果借鉴自SwipeMenu,并对SipwMenu的源码做了修改与Bug修复,然后才开发出的SwipeRecyclerView. 需要说明的是,本库没有对RecyclerView做大的修改,只是ItemView的封装.看起来是对RecyclerView的修改,其实仅仅是为RecyclerView添加了使用的方法API而已. 本库已经更新了三个版本了,会一直维护下去,根据小伙伴的要求,以后也会添加一些其它功能. SwipeRecyclerView将完美解决这些问题: 以下功能全

[Unity3d ios]开发- 实现iphone手指拖拽

using UnityEngine; using System.Collections; public class Test : MonoBehaviour { private Vector3 screenPoint; private Vector3 offset; // Update is called once per frame void Update () { for (int i = 0; i < Input.touchCount; ++i) { if (Input.GetTouch(

苹果紧急发布新系统iOS 11.0.1 修复多种BUG

本文讲的是苹果紧急发布新系统iOS 11.0.1 修复多种BUG,不久前,苹果面向所有的 iOS 设备推送了最新版的 iOS 11 操作系统,和往年一样,新版系统给用户设备带来各种各样的问题以及软件 BUG,导致部分软件运行缓慢,甚至死机.据外媒最新消息,面对用户提出的各种意见,苹果迅速发出了一个升级包. 据美国科技新闻网站 AppleInsider 报道,周二,在 iOS 11 发布一周之后,苹果对外发布了升级包以及最新版系统 iOS 11.0.1,新版本旨在修正之前版本存在的各种软件问题.

苹果再发iOS 11.0.3更新 依旧以小范围升级与修复为主

今日,苹果发布了iOS 11.0.3,这是iOS 11操作系统正是推送之后的第三次官方更新了.相距IOS11.0.2版本发布不足两周. 下面是这次更新包含的主要内容: ·修复了音频和触感反馈在部分iPhone 7和iPhone 7 Plus设备上无法正常工作的问题. ·解决了部分iPhone 6s显示屏由于维修时使用非原厂Apple部件而导致触摸输入无响应的问题. iOS 11升级带来了重新设计的锁屏体验.一个可定制的控制中心.更自然的Siri语音.重新设计的应用商店.新的HEVC和HEIF c

【Swift 3.0】iOS 国际化切换语言

有的 App 可能有切换语言的选项,结合系统自动切换最简单的办法: fileprivate var localizedBundle: Bundle = { return Bundle(path: Bundle.main.path(forResource: "zh-Hans", ofType: "lproj")!)! }() public func LocalizedString(_ key: String, comment: String) -> String

App开发团队必须知道的 iOS 11 更新点

本文讲的是App开发团队必须知道的 iOS 11 更新点,WWDC 2017 已经过去差不多一个季度了,最近随着 Xcode 9 正式版以及 iPhone 8.iPhone X 的发布,iOS 11 的全面适配也被提上了日程.我整理了一下更新点,包括开发.设计.产品甚至是市场都应该注意的点,分享出来希望对大家有所帮助. 新增框架 ARKit iOS 11 引入了新的 ARKit 框架,让您轻松创建无可比拟的 iPhone 和 iPad 增强现实体验. 通过将数字对象和信息与您周围的环境相融合,A

[译]开发者眼中 iOS 11 都更新了什么?

本文讲的是[译]开发者眼中 iOS 11 都更新了什么?, 原文地址:What's new in iOS 11 for developers 原文作者:Paul Hudson 译文出自:掘金翻译计划 译者: Swants 校对者: Danny1451 RichardLeeH 苹果在 2017 年全球开发者大会上公布了 iOS 11 , 其加入许多强大的功能,如 Core ML,ARKit,Vision,PDFKit,MusicKit 拖放等等. 我尝试着把主要变化在接下来的文章里总结了出来,并在

iOS流布局UICollectionView系列五——圆环布局的实现

iOS流布局UICollectionView系列五--圆环布局的实现 一.引言         前边的几篇博客,我们了解了UICollectionView的基本用法以及一些扩展,在不定高的瀑布流布局中,我们发现,可以通过设置具体的布局属性类UICollectionViewLayoutAttributes来设置设置每个item的具体位置,我们可以再扩展一下,如果位置我们可以自由控制,那个布局我们也可以更加灵活,就比如创建一个如下的circleLayout: 这种布局方式在apple的官方文档中也有

iOS流布局UICollectionView系列一——初识与简单使用UICollectionView

iOS流布局UICollectionView系列一--初识与简单使用UICollectionView 一.简介         UICollectionView是iOS6之后引入的一个新的UI控件,它和UITableView有着诸多的相似之处,其中许多代理方法都十分类似.简单来说,UICollectionView是比UITbleView更加强大的一个UI控件,有如下几个方面: 1.支持水平和垂直两种方向的布局 2.通过layout配置方式进行布局 3.类似于TableView中的cell特性外,