7

मैं एक कोर डेटा एप्लिकेशन पर काम कर रहा हूं जिसमें वृक्ष के समान प्रबंधित वस्तुओं की बजाय बड़ी पदानुक्रम है।NSUndoManager, कोर डेटा और चुनिंदा पूर्ववत/फिर से

जब मूल वस्तु बनाई जाती है, तो यह कुछ बच्चे वस्तुओं को बनाता है जो बदले में अपने स्वयं के बच्चे की वस्तुएं बनाते हैं। इनमें से प्रत्येक बच्चे वस्तुएं NSURLConnections का उपयोग करके जानकारी एकत्र कर सकती हैं।

अब, मैं प्रबंधितObjectContext में undoManager के साथ पूर्ववत/फिर से समर्थन करना चाहता हूं। समस्या यह है कि, यदि कोई उपयोगकर्ता मूल वस्तु बनाता है, तो उस क्रिया को पूर्ववत करने का प्रयास करता है, मूल वस्तु को हटाया नहीं जाता है। इसके बजाय, एक या अधिक बाल वस्तुओं को हटाया जा सकता है। जाहिर है इस प्रकार की कार्रवाई अप्रत्याशित और अवांछित है।

इसलिए मैंने डिफ़ॉल्ट रूप से पूर्ववत पंजीकरण को अक्षम करने का प्रयास किया। प्रबंधितऑब्जेक्ट कॉन्टेक्स्ट में कुछ भी संशोधित होने से पहले मैंने disableUndoRegistration: पर कॉल करके ऐसा किया था। फिर, बेस ऑपरेशंस से पहले पूर्ववत पंजीकरण सक्षम करना जैसे बेस ऑब्जेक्ट बनाना फिर से रजिस्ट्रेशन के बाद पुनः अक्षम करना।

undo: NSUndoManager 0x1026428b0 is in invalid state, undo was called with too many nested undo groups

विचार:

अब जब मैं पूर्ववत करने के लिए प्रयास करते हैं, मैं इस त्रुटि मिलती है?

आपका की जांच करनी चाहिए सेब का यह प्रलेखन: जब तक यह अपने परिवर्तनों

// do your stuff 

// give the run loop a breath 

[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:[NSDate date]]; 
[undoManager disableUndoRegistration]; 

उत्तर

6

NSUndoManager अगले रन पाश चक्र के लिए इंतजार कर रहा है कहते हैं:

.. The undo message closes the last open undo group and then applies all the undo operations in that group ... If any unclosed, nested undo groups are on the stack when undo is invoked, it raises an exception. To undo nested groups, you must explicitly close the group with an endUndoGrouping message, then use undoNestedGroup to undo it.

http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Conceptual/UndoArchitecture/Articles/PerformingUndo.html

+0

यह मेरे लिए काम किया! –

5

एक साल से भी अधिक पंजीकृत करता है के बाद से इस सवाल का पोस्ट किया गया था, लेकिन फिर भी यहाँ एक जवाब है

0

NSUndoManager is in invalid state, undo was called with too many nested undo groups के साथ मेरा चौराहे कोरडाटा शामिल नहीं था हालांकि मेरा जवाब उपयोगी नहीं हो सकता है।

मेरे मामले में यह पूर्व कोड प्रबंधक अपवाद उठाया गया था जो मेरे कोड में एक अनिश्चित अपवाद के कारण उठाया गया था जिसे NSUndoManager -undo के कॉल के दौरान उठाया गया था।

कंसोल के माध्यम से वापस देखकर मैं अपने ऐप कोड अपवाद और पूर्ववत प्रबंधक के एनएसआईएननल इन्कॉन्सिस्टेंसी अपवाद दोनों को देख सकता था।

मैंने डिफ़ॉल्ट रनलोप पूर्ववत समूह व्यवहार का उपयोग किया और मेरे पूर्व पंजीकरण को स्पष्ट रूप से समूहित नहीं किया।