2009-04-23 82 views
8

在我的核心數據模型中,我有一個叫做listItems的關係,它鏈接到幾個listItem實體,每個實體都有一個stringValue屬性。我創建了一個基本上是NSTextFields列表的控件,每個列表項目一個。該控件正確地綁定到listItems,並且我已經設置了該按鈕,以便按下返回鍵將在當前編輯的項目下直接創建一個新字段,並將焦點更改爲新字段。所以,基本上,要添加一個新項目,用戶按下Return。同樣,如果用戶結束編輯,並且當前編輯的字段爲空,則該字段將被刪除(因爲空字段僅在「編輯模式」期間出現,所以可以這麼說)。這工作得很好。基本上,我listItem NSManagedObject子類,我做到以下幾點:禁用撤銷創建/刪除NSManagedObject

// Don't allow nil values 
if (!value && [[self.recipe ingredients] count] > 1) { 
    for (EAIngredientRef *ingredient in [self.recipe ingredients]) { 
     if ([[ingredient sortIndex] integerValue] > [[self sortIndex] integerValue]) { 
      [ingredient setSortIndex:[NSNumber numberWithInteger:([[ingredient sortIndex] integerValue]-1)]]; 
     } 
    } 
    [[self managedObjectContext] deleteObject:self]; 
    return; 
} 

// Code to handle if it is a real value 

我遇到的問題是,每一個行被刪除這種方式時,它與UndoManager的註冊。因此,如果我編輯一行,按回車鍵(它會創建一個新行),然後點擊結束編輯,該行就會消失。但是,如果我撤消,空白字段會再次出現。我的目標是讓撤銷管理器忽略涉及空字段的刪除操作。

我該怎麼辦?我已經使用[[[self managedObjectContext] undoManager] disableUndoRegistration]並在幾個點的相關enableUndoRegistration嘗試(如-didTurnIntoFault,但我懷疑撤銷註冊可能在此之前,方法發生)

回答

18

如果你深入更深入地進入核心數據文檔,你」會發現這個珍聞隱藏起來:

[[self managedObjectContext] processPendingChanges]; 
[[[self managedObjectContext] undoManager] disableUndoRegistration]; 
// Do your work 
[[self managedObjectContext] processPendingChanges]; 
[[[self managedObjectContext] undoManager] enableUndoRegistration]; 

更改與撤消管理登記正常,直到事件循環的結束,所以正在註冊你會變成撤消登記回。上述強制它發生在你想要的時候。