UICollectionViewUpdateItem操作 - 在集合视图中删除项目时,iOS6上无法识别的选择器

时间:2014-03-21 09:38:23

标签: ios objective-c ios7 ios6 uicollectionview

我在iOS6上为我的应用找到了一个奇怪的错误。

我正在使用Collection视图来表示"树结构"为我的应用程序。每个单元格里面都有一个tableview,当我在表格视图中选择一个单元格时,我用另一个tableview推送一个新的集合视图单元格。

在树"的根目录中选择tableview单元格时,我需要清除其他集合视图单元格,并显示新的单元格视图单元格。我是这样做的:

for(id e in oldData)
{
    if(i < indexPath.row)
    {
        [newData addObject:e];
    }
    else
    {
        [indexPaths addObject:[NSIndexPath indexPathForItem:i inSection:indexPath.section]];
    }
    i++;
}
self.tree = newData;

[self.collectionView deleteItemsAtIndexPaths:indexPaths];

这在iOS7中非常出色。但是,在iOS6中,我有时会获得此异常:

'NSInvalidArgumentException', reason: '-[UICollectionViewUpdateItem action]: unrecognized selector sent to instance 0xa3eedd0'

此行例外发生

[self.collectionView deleteItemsAtIndexPaths:indexPaths];

我发现了一些关于这个特定问题的线索,但它似乎与iOS6上的键盘外观有关。

如何在iOS6上找到此错误的解决方法?

感谢。

编辑:

我认为问题的原因是这个。检查我的新问题: Subclassing UICollectionViewFlowLayout sometimes crashes on iOS6

3 个答案:

答案 0 :(得分:2)

参考Docs 请确保以下事项:

  1. indexPaths参数不得为nil。 (另外,您应该检查indexPaths是否没有当前集合视图中不存在的任何索引)
  2. 您在调用此方法之前已更新数据源。
  3. e.g。

    [indexPaths removeAllObjects];
    for(id e in oldData)
        {
        if(i < indexPath.row)
        {
            [newData addObject:e];
        }
        else
        {
            [indexPaths addObject:[NSIndexPath indexPathForItem:i inSection:indexPath.section]];
        }
        i++;
    }
    self.tree = newData;
    if([indexPaths count])
        [self.collectionView deleteItemsAtIndexPaths:indexPaths];
    

    希望这有帮助。

答案 1 :(得分:1)

我之前遇到过类似的问题。

我在调用deleteItem方法之前辞职了。

[[UIApplication sharedApplication].keyWindow findAndResignFirstResponder];

希望它有所帮助。

答案 2 :(得分:-1)

可靠地解雇键盘是这样的:

[self.view endEditing:YES];

此外,您可能有更新问题,请使用:

[tableView beginUpdates];
// make changes
[tableView endUpdates];

在更新UIKit视图时始终在主线程上。

最坏情况,imeplement操作因此单元格确实响应了选择器[UICollectionViewUpdateItem action]:

-(SEL) action{
    // break here to find thread that is calling me!
    return nil;
}