2009-04-23 12 views
8

के निर्माण/हटाने के लिए पूर्ववत अक्षम करें मेरे कोर डेटा मॉडल में, मुझे listItems नामक एक रिश्ते मिला है जो कई listItem इकाइयों से लिंक करता है, प्रत्येक stringValue विशेषता के साथ। मैंने एक नियंत्रण बनाया है जो प्रत्येक सूची आइटम के लिए अनिवार्य रूप से NSTextFields की एक सूची है। नियंत्रण listItems से ठीक है, और मैंने इसे सेट अप किया है ताकि रिटर्न कुंजी दबाकर वर्तमान में संपादित किए गए एक के तहत सीधे एक नया फ़ील्ड बनाया जा सके और फोकस को नए फ़ील्ड में बदल दिया जा सके। इसलिए, अनिवार्य रूप से, एक नया आइटम जोड़ने के लिए, उपयोगकर्ता रिटर्न दबाता है।NSManagedObject

इसी प्रकार, यदि उपयोगकर्ता संपादन समाप्त कर देता है और वर्तमान में संपादित फ़ील्ड खाली है, तो फ़ील्ड हटा दिया जाता है (जैसा कि खाली फ़ील्ड केवल "संपादन मोड" के दौरान दिखाई देते हैं, इसलिए बोलने के लिए)। यह बहुत अच्छी तरह से काम करता है। मूल रूप से, मेरे listItem 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

आप कोर डाटा दस्तावेज़ों में और अधिक गहराई से गोता हैं, तो आप ' मिलेगा इस tidbit दूर छिपा हुआ:

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

परिवर्तनों को पूर्ववत् प्रबंधक के साथ सामान्य रूप से घटना पाश के अंत तक पंजीकृत नहीं हैं, और इसलिए पंजीकृत किया जा रहा था के बाद आप पीठ पर पूर्ववत पंजीकरण कर दिया था। उपरोक्त बल तब होता है जब आप चाहते हैं।

संबंधित मुद्दे