UICollectionView无效的项目数,添加和删除元素的数组

时间:2012-09-22 03:42:53

标签: objective-c ios core-data ios6 uicollectionview

我正在开发一个带有UICollectionView的iPhone应用程序,我正在尝试创建像iPhone弹簧板这样的文件夹。我有它的工作,但我遇到了关于使用核心数据添加和减少细胞的错误。我希望有人可以解释我是如何避免这个错误的?提前谢谢。

* 由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第0部分中的项目无效。更新后现有部分中包含的项目数(4)必须等于更新前该部分中包含的项目数(3),加上或减去从该部分插入或删除的项目数(插入0,删除0)和加或减移入的项目数或超出该部分(0移入,0移出)。'

------ mainViewController

            //**Document One**
            //get first doc and create it as a sub doc
            Document * docToCopy = [[self birds] objectAtIndex:longPressFolderLayout.pinchedCellPath.row];
            SubDocument *doc = [[SubDocument alloc] initInsertingIntoManagedObjectContext:managedObjectContext];
            [doc setTitle:docToCopy.title];
            [doc setThumbnail:docToCopy.thumbnail];
            [doc setIsFolder:[NSNumber numberWithInt:0]];
            [doc setDate:docToCopy.date];


            //**Document Two**
            //get second doc and create it as a sub doc
            Document * docToCopy2 = [[self birds] objectAtIndex:cellAttributes.indexPath.row];
            SubDocument *doc2 = [[SubDocument alloc] initInsertingIntoManagedObjectContext:managedObjectContext];
            [doc2 setTitle:docToCopy2.title];
            [doc setThumbnail:docToCopy2.thumbnail];
            [doc2 setIsFolder:[NSNumber numberWithInt:0]];
            [doc2 setDate:docToCopy2.date];
            [self add:@"folder" image:[UIImage imageNamed:@"folderDefaultImage"] date:[NSDate date] folder:[NSNumber numberWithInt:1]];

            //**Folder**
            //create a folder and append both sub docs and then remove the original docs
            Document * origFolder = [[self birds] objectAtIndex:([[self birds]count]-1)];
            [origFolder appendDoc:doc];
            [origFolder appendDoc:doc2];
            [origFolder setIsFolder:[NSNumber numberWithInt:1]];
            currentOpenFolder = origFolder;
            [self removePageAtIndex:longPressFolderLayout.pinchedCellPath.row];
            [self removePageAtIndex:cellAttributes.indexPath.row];

------ DocumentNSManagedObject

- (void)appendDoc:(SubDocument *)doc
{
[[self mutableSetValueForKey:@"subDocument"] addObject:doc];
[(NSMutableArray *)[self subDocumentsOrdered] addObject:doc];

    NSError *error = nil;
[[self managedObjectContext] save:&error];
}
- (void)deleteDoc:(SubDocument *)doc
{
    [[self mutableSetValueForKey:@"subDocument"] removeObject:doc];
    [(NSMutableArray *)[self subDocumentsOrdered]removeObject:doc];
    NSError *error = nil;
[[self managedObjectContext] save:&error];
}
- (NSArray *)subDocumentsOrdered
{
if (!subDocumentsOrdered)
{
subDocumentsOrdered = [[[[self subDocument] allObjects] sortedArrayWithOptions:NSSortStable|NSSortConcurrent usingComparator:(NSComparator) ^(SubDocument *stroke1, SubDocument *stroke2)
                          {
                              return [[stroke1 date] compare:[stroke2 date]];
                          }
                          ] mutableCopy];
}
    return subDocumentsOrdered;
}

2 个答案:

答案 0 :(得分:4)

错误消息与UICollectionView以及您在添加和删除项目时所提供的信息有关,或者回复UICollectionViewDataSource方法,例如collectionView:numberOfItemsInSection:

基本上,您在UICollectionView上执行的操作不会累加。

它在第0节告诉你

  • 您从该部分中的3个项目开始,即您通过返回collectionView:numberOfItemsInSection:来回复3
  • 您没有插入或删除任何项目。
  • 您现在说该部分有4个项目,即您通过返回collectionView:numberOfItemsInSection:来回复4

所以UICollectionView抱怨说你告诉它该部分还有一个额外的项目,但你没有告诉它在哪里插入它。所以这就是你需要做的。

core-dataUICollectionView

有很大关系

答案 1 :(得分:0)

我最近在我的应用中遇到了一个非常类似的问题。如果您查看添加页面的位置,我敢打赌您不会将它们保存到NSManagedObjectContext。一个简单的解决方案就是写:

[[self managedObjectContext]save:nil];

希望这会有所帮助。祝你好运。