2009-04-23 26 views
8

oluşturma/silme için geri alma devre dışı bırakma Temel Veri modelimde, her biri stringValue özniteliğine sahip olan çeşitli listItem öğelerine bağlantı veren listItems adlı bir ilişkim var. Temel olarak, her liste öğesi için bir tane olan NSTextFields'un bir listesi olan bir denetim oluşturdum. Kontrol, listItems'a uygun şekilde bağlanmış ve ben bunu ayarlıyorum ki, geri dönüş tuşuna basıldığında, halihazırda düzenlenmiş olanın altında yeni bir alan yaratılır ve odağı yeni alana değiştirir. Yani, esasen, yeni bir öğe eklemek için, kullanıcı Return tuşuna basar.NSManagedObject

Benzer şekilde, kullanıcı düzenleme işlemini bitirir ve düzenlenmiş alan boşsa, alan kaldırılır (boş alanlar yalnızca "düzenleme modunda" gibi görünür). Bu oldukça iyi çalışıyor. Temelde, benim listItem NSManagedObject alt sınıfta, ben aşağıdakileri yapın:

// 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 

Ben karşılaşmamdır sorun bir satır bu şekilde silindiği her seferinde, undoManager kaydolmuş olmasıdır. Bu yüzden, bir satırı düzenlerseniz, Return tuşuna basın (yeni bir satır oluşturur) ve düzenlemeyi bitirmek için tıkladığınızda satır kaybolur. Ancak, daha sonra geri alırsam, boş alan yeniden görünür. Amacım, undoManager tarafından boş alanlarla ilgili silme işlemlerinin yok sayılmasıdır.

Bunun için nasıl giderim? Ben [[[self managedObjectContext] undoManager] disableUndoRegistration] ve birkaç sıralarda ilişkili enableUndoRegistration kullanarak denedim (-didTurnIntoFault gibi, ama ben geri alma kaydı o yönteme öncesinde neler olabileceğini şüpheli) Eğer Çekirdek Veri docs içine daha derin dalış ise

cevap

18

, sen' göreceksiniz bu çerez gizlenmiş:

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

değişiklikler normalde olay döngüsünün sonuna kadar geri alma yöneticisi kayıtlı olmayan ve bu nedenle tekrar geri alma kayıt dışı bıraktığınızda sonra tescil ediliyordu. Yukarıdaki, bunu istediğiniz zaman ortaya çıkmasına zorlar.

İlgili konular