2011-01-31 14 views
6

के साथ नेस्टेड पूर्ववत समूह मैं एक कोर्डा समर्थित बैक किए गए आईफोन एप्लिकेशन में एक पूर्ववत प्रबंधक जोड़ना चाहता हूं। जब उपयोगकर्ता कोई नई ऑब्जेक्ट जोड़ने की कोशिश करता है (+ बटन पर टैप करके) मैं एक नया मोडल व्यू कंट्रोलर लोड करता हूं औरडिडलोड में एक नया पूर्ववत समूह शुरू करता हूं।कोरडाटा

जब उपयोगकर्ता रद्द करें बटन दबाता है, तो मैं रद्द करें कॉलबैक में परिवर्तनों को रोलबैक करना चाहता हूं।

क्वेरी:

  1. क्या यह संभव है एक नेस्ट पूर्ववत समूह शुरू करने और घटना पाश के माध्यम से जारी रहती है और सभी परिवर्तनों को एक ही पूर्ववत समूह में किया जाता मुक़ाबला करने के लिए? अभी, जब मैं startAndoGrouping को रद्द करने में कॉल करता हूं, तो मुझे एक लापता स्टार्टऑन्डो ग्रुपिंग अपवाद मिलता है।
  2. NSUndoManager के लिए समूहों ByEvent API का महत्व क्या है? क्या मुझे इवेंट लूप के माध्यम से पूर्ववत समूह को जारी रखने के लिए इसे सेट करने की आवश्यकता है?
  3. परिवर्तन में क्या करने की आवश्यकता है परिवर्तन कॉलबैक स्थायी परिवर्तन करने के लिए (mangedObjectContext पर सहेजने के अलावा)? परिवर्तनों को ट्रैक करना बंद करने के लिए मैं पूर्ववत प्रबंधक को कैसे बताऊं?

त्रुटि संदेश:

* न आया हुआ अपवाद 'NSInternalInconsistencyException', कारण की वजह से एप्लिकेशन समाप्त: '_endUndoGroupRemovingIfEmpty :: NSUndoManager 0x75415f0 अमान्य स्थिति में है, कोई मिलता-जुलता के साथ बुलाया endUndoGrouping शुरू

नमूना कोड:

// RootViewController.m 
- (void) addAction { 
    // Load Modal View Controller to add new object 

} 

// AddViewController.m 
- (void) viewDidLoad { 
    // Start nested undo group 
    [self.managedObjectContext processPendingChanges]; 
    [self.managedObjectContext.undoManager beginUndoGrouping]; 

    [self createModel]; 

} 

- (void) cancelAction { 
    // Revert all changes 
    [self.managedObjectContext processPendingChanges]; 
    [self.managedObjectContext.undoManager endUndoGrouping]; 

    [self.managedObjectContext.undoManager undoNestedGroup]; 

    ... 
} 

- (void) saveAction { 

    // Save changes 
} 

उत्तर

7

अपने विशिष्ट प्रश्नों के साथ शुरुआत - हाँ, आप मैन्युअल रूप से def startUndoGrouping और endUndoGrouping का उपयोग कर पूर्ववत ऑपरेशन की सीमाएं खाएं।

इस मामले में, पूर्ववत ऑपरेशन को काम करना चाहिए चाहे समूह ByEvent सेट हो या नहीं। ऐसा इसलिए है क्योंकि इवेंट लूप द्वारा जेनरेट किए गए सभी पूर्ववत समूह प्रारंभिक समूह के साथ शुरू किए गए आपके मुख्य ओपन पूर्ववत समूह के तहत घोंसला किए जाते हैं, और जब तक आप endUndoGrouping को कॉल करने के बाद सीधे पूर्ववत किए गए समूह को कॉल करते हैं, तो इसे काम करना चाहिए। यदि आप ईवेंट लूप पूर्ववत समूह का उपयोग नहीं कर रहे हैं, तो इसके बारे में चिंता न करें और इसे NO पर सेट करें।

अपने परिवर्तनों को स्थायी बनाने के लिए, एंडयू समूह के साथ पूर्ववत समूह को बंद करें और अपने संदर्भ पर सहेजें को कॉल करें। प्रक्रिया PendingChanges कॉल की आवश्यकता नहीं है, और नेस्टेड समूहों में समस्याएं हो सकती हैं। यदि आप पूर्ववत संचालन को साफ़ करना चाहते हैं, तो EndUndoGrouping के बाद अपने undomanager पर हटाएंअलेक्शन - यह गारंटी देता है कि परिवर्तन कभी भी नहीं किए जाएंगे।

यह सुनिश्चित करने के लिए ब्रेकपॉइंट्स/एनएसएलओएल का उपयोग करें कि आपकी शुरुआत/समाप्ति कॉल एक के लिए एक हैं।viewWillDisappear

में endUndoGrouping

  • कॉल viewWillAppear को

    • ले जाएँ beginUndoGrouping:

      आप अपने एक 'पूर्ववत करें बटन' की तरह बनना कार्रवाई को रद्द करना चाहते हैं, तो आपको निम्न करना होगा

    • अपनी रद्द कार्रवाई के अंत में पूर्ववत समूह को फिर से खोलें

    • फिर से खोलें अपने को बचाने के एक्शन के अंत में समूहीकरण पूर्ववत

    अन्यथा, यदि आप इसे छोड़ना है, सुनिश्चित करें कि आप अपने को बचाने और रद्द कार्यों में संवाद बंद, endUndoGrouping की संभावना कई बार बुलाया जा रहा से बचने के लिए करते हैं।

    यदि आपके कोई प्रश्न हैं, तो कृपया टिप्पणी करें और मैं अपडेट करूंगा।

    शुभकामनाएं!

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