2012-09-22 95 views
-1

我正在使用UICollectionView創建iPhone應用程序,並且正在嘗試創建類似iPhone彈簧板的文件夾。我有它的工作,但我遇到了關於使用核心數據的單元格的加法和減法這個錯誤。我希望有人能解釋我如何避免這個錯誤?先謝謝你。UICollectionView項目數量無效,數組添加和刪除元素

*終止應用程序由於未捕獲的異常「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

我在我的應用程序最近有一個非常類似的問題做。如果你看看你在哪裏添加頁面,我敢打賭你並沒有將它們保存到NSManagedObjectContext中。一個簡單的解決方案是隻寫:

[[self managedObjectContext]save:nil]; 

希望這會有所幫助。祝你好運。

+0

你知道是什麼導致了問題,爲什麼這是解決方案?如果是這樣會改善這個問題/答案在這裏添加一些細節。 –

+0

例如,此處顯示的保存可能只是簡單地觸發視圖的完整重建,儘管這會導致錯誤消失,但可能不會產生最佳性能,這可能會隨着應用程序的開發或您在設備上進行測試而出現問題。 –

4

的錯誤信息是與UICollectionView和你爲它提供的信息做您添加和移除項目或對其作出響應UICollectionViewDataSource方法如collectionView:numberOfItemsInSection:

基本上您在上執行的操作不加起來。

它告訴你,在第0

  • 您在節開始3項,即您通過返回3迴應collectionView:numberOfItemsInSection:
  • 您沒有插入或移除任何項目。
  • 您現在說節中有4項,即您通過返回4回覆collectionView:numberOfItemsInSection:

因此,UICollectionView抱怨說,你告訴它在該部分有一個額外的項目,但你沒有告訴它在哪裏插入它。所以這是你需要做的。

它並不真的有很多工作要做,core-data它與UICollectionView

+0

我有點已經知道這只是看着這個問題,當談到表視圖。他們在我的代碼中可以提供的任何特定技巧。謝謝。 – BDGapps

+0

您提供的代碼與所顯示的錯誤消息沒有直接關係,所以沒有提示。您只需確保在更改數據模型時向UICollectionView提供正確的信息。核心數據模型和UICollectionView之間沒有「自動」關係,您需要確保您一直在雙方進行操作。即如果您從數據模型中刪除項目,請確保將其從視圖中移除,將項目添加到模型中將其添加到視圖等。 –

+0

對不起,我不明白你在說什麼。我正在添加和刪除那裏的項目。我有什麼要調用集合視圖來更新以及我有多頻繁地調用它?每當我添加一個? – BDGapps