我正在开发一个带有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;
}
答案 0 :(得分:4)
错误消息与UICollectionView
以及您在添加和删除项目时所提供的信息有关,或者回复UICollectionViewDataSource
方法,例如collectionView:numberOfItemsInSection:
基本上,您在UICollectionView
上执行的操作不会累加。
它在第0节告诉你
collectionView:numberOfItemsInSection:
来回复3
。collectionView:numberOfItemsInSection:
来回复4
。所以UICollectionView
抱怨说你告诉它该部分还有一个额外的项目,但你没有告诉它在哪里插入它。所以这就是你需要做的。
core-data
与UICollectionView
答案 1 :(得分:0)
我最近在我的应用中遇到了一个非常类似的问题。如果您查看添加页面的位置,我敢打赌您不会将它们保存到NSManagedObjectContext。一个简单的解决方案就是写:
[[self managedObjectContext]save:nil];
希望这会有所帮助。祝你好运。