我想重新排序我的uicollection视图的单元格。当我尝试时,它有时会工作(有滞后)但有时,我的应用程序崩溃了。 我在互联网上到处搜索,但直到现在都无法找到答案。
func handleLongGesture(panRecognizer: UIPanGestureRecognizer){
let locationPoint: CGPoint! = panRecognizer.locationInView(collectionView)
guard let selectedIndexPath : NSIndexPath = collectionView.indexPathForItemAtPoint(locationPoint) else {
return
}
if panRecognizer.state == .Began{
collectionView.beginInteractiveMovementForItemAtIndexPath(selectedIndexPath)
indexPathSelectedItem = selectedIndexPath
}
else if panRecognizer.state == .Changed{
collectionView.updateInteractiveMovementTargetPosition(locationPoint)
}
else if panRecognizer.state == .Ended{
collectionView.endInteractiveMovement()
}
}
这是我正在尝试的上述代码。我无法在整个代码中找到错误。 我想告诉你,我也尝试使用断点来找出我的应用程序崩溃的位置,我发现有时控制无法进入状态“panRecognizer.state == .Ended”,我认为这就是我的原因应用程序崩溃。
答案 0 :(得分:0)
如果没有崩溃日志,很难确切地说出发生了什么,但同时提出了一些建议:
<强>首先强>
您在方法的顶部有一个漂亮的警卫声明,我建议您添加let locationPoint: CGPoint! = panRecognizer.locationInView(collectionView)
。这样您就不必强行打开包装,代码将受到保护,免受此特定崩溃的影响。
<强>第二强>
当您调用集合视图的endInteractiveMovement()
方法时,它将依次调用您的委托方法collectionView:moveItemAtIndexPath:toIndexPath:
,让您现在需要更新数据源并将项目移动到那里。
确保您已实施并将相关对象移动到正确的位置!如果没有,您的应用程序将崩溃,因为数据源不再与集合视图同步。
<强>第三强>
我建议您使用switch语句而不是if-else来捕获所有其他可能的状态,这将使您可以取消移动操作(您现在没有这样做):
switch(panRecognizer.state) {
case UIGestureRecognizerState.Began:
// Begin movement
collectionView.beginInteractiveMovementForItemAtIndexPath(selectedIndexPath)
indexPathSelectedItem = selectedIndexPath
case UIGestureRecognizerState.Changed:
// Update movement
collectionView.updateInteractiveMovementTargetPosition(locationPoint)
case UIGestureRecognizerState.Ended:
// End movement
collectionView.endInteractiveMovement()
default:
collectionView.cancelInteractiveMovement()
}
}