2009-12-07 17 views
7

मैं मुसीबत एक कोर-डेटा का समर्थन किया NSArrayController मेरी कोड में ठीक से काम करने के लिए हो रही हो रहा है। जब मैं setSelectionIndex कॉल करने का प्रयासNSArrayController प्रारंभ

pageArrayController = [[NSArrayController alloc] initWithContent:nil]; 
    [pageArrayController setManagedObjectContext:[self managedObjectContext]]; 
    [pageArrayController setEntityName:@"Page"]; 
    [pageArrayController setAvoidsEmptySelection:YES]; 
    [pageArrayController setPreservesSelection:YES]; 
    [pageArrayController setSelectsInsertedObjects:YES]; 
    [pageArrayController setClearsFilterPredicateOnInsertion:YES]; 
    [pageArrayController setEditable:YES]; 
    [pageArrayController setAutomaticallyPreparesContent:YES]; 
    [pageArrayController setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"index" ascending:YES]]]; 
    BOOL result = [pageArrayController setSelectionIndex:0]; 

:, यह हाँ देता है, यह दर्शाता है कि चयन सफलतापूर्वक बदल दिया गया: नीचे मेरी कोड है। हालांकि, किसी भी बाद में getSelectionIndex पृष्ठ पर कॉल करता हैअरे कंट्रोलर ऑब्जेक्ट NSNotFound देता है।

मैं क्या समझ में नहीं आता है कि अगर मैं एक निब में NSArrayController रखा, और निब फ़ाइल प्रारंभ (इंटरफ़ेस बिल्डर में एक ही सभी विशेषताओं के साथ) करने की अनुमति, NSArrayController ठीक से काम करता है।

व्यवहार में कोई अंतर क्यों है? क्या एनआईबी फ़ाइल इन प्रकार की वस्तुओं को विशेष तरीके से शुरू करती है? क्या NSArrayController का मेरा प्रारंभिक गलत है?

किसी भी मदद की सराहना की है। धन्यवाद।

+0

'-getSelectionIndex' विधि जैसी कोई चीज़ नहीं है। क्या आपने खुद को ऐसी विधि लिख ली है, या वास्तव में कुछ अलग कह रही है? –

+0

मेरा मतलब था- चयन इंडेक्स। –

उत्तर

14

हाँ, महत्वपूर्ण व्यक्ति एक विशेष तरीके से वस्तुओं को प्रारंभ करते हैं और कभी कभी यह पता लगाने की कि दोहराने के लिए कितना मुश्किल हो सकता है। मैंने इसके साथ भी संघर्ष किया और आखिरकार ऐप्पल के कोर डेटा प्रोग्रामिंग गाइड >> कोर डेटा और कोका बाइंडिंग्स >>Automatically Prepares Content Flag में उत्तर मिला (Cocoa Dev सूची पर डेव फर्नांडीस के लिए धन्यवाद)। जवाब यह है कि यदि आप शून्य सामग्री के साथ एक सरणी नियंत्रक प्रारंभ करते हैं, तो आपको एक fetch भी करने की आवश्यकता है।

BOOL result; 
NSArrayController *pageArrayController = [[NSArrayController alloc] initWithContent:nil]; 
[pageArrayController setManagedObjectContext:[self managedObjectContext]]; 
[pageArrayController setEntityName:@"Page"]; 
NSError *error; 
if ([pageArrayController fetchWithRequest:nil merge:YES error:&error] == NO) 
    result = NO; 
else 
{ 
    //do all that other pageArrayController configuration stuff 
    result = [pageArrayController setSelectionIndex:0]; 
} 

Btw, [NSSortDescriptor sortDescriptorWithKey: @ "सूचकांक" आरोही: हाँ]] एक चेतावनी उठाती है।

+0

इसके अलावा, [self प्रबंधितObjectContext] का उपयोग यह दर्शाता है कि आपने ऐपडिलेगेट में अपना पेजअरे कंट्रोलर विधियां जोड़ दी हैं। यह अच्छा अभ्यास नहीं माना जाता है।आपको वास्तव में एक अलग पृष्ठ नियंत्रक ऑब्जेक्ट (और मॉडल और मॉडल को देखने के लिए, एमवीसी पैटर्न को लागू करने के लिए आवश्यक) बनाने में देखना चाहिए जो आपके आवेदन की संपूर्ण पृष्ठ कार्यक्षमता का ख्याल रखेगा। आवश्यक होने पर पेज नियंत्रक या पृष्ठ मॉडल ऑब्जेक्ट [[NSApp प्रतिनिधि] प्रबंधित ऑब्जेक्ट कॉन्टेक्स्ट] को कॉल कर सकते हैं। –

+0

इस समाधान के लिए धन्यवाद, यह पूरी तरह से काम करता है। मेरी ऐप संरचना अब बहुत अच्छी है कि मैं निब्स पर भरोसा करने के बजाय इन सरणी नियंत्रकों को कोड में बना सकता हूं। –

+0

आप मेरे दोस्त, एक किंवदंती हैं! मैंने यह जानने का प्रयास करने में कई दिन बिताए कि क्यों मेरा सर नियंत्रक अपडेट नहीं कर रहा था क्योंकि नया डेटा iCloud से मेरे कोर डेटा स्टोर में आया था। अब यह पूरी तरह से काम करता है। धन्यवाद। – Fin

0

जहां तक ​​क्यों व्यवहार में एक फर्क हो सकता है:

  1. नोक फ़ाइलें NSCoder का उपयोग कर धारावाहिक वस्तुओं की दुकान।
  2. आप शायद चीजों के आईबी पक्ष पर बाध्यकारी उपयोग कर रहे हैं, जहां आपके कोड में आप सीधे सेट विधि का उपयोग कर प्रबंधित ऑब्जेक्ट संदर्भ सेट कर रहे हैं।

    [pageArrayController bind:@"managedObjectContext" 
           toObject:self 
           withKeyPath:@"managedObjectContext" 
            options:nil]; 
    

    मैं अन्यथा द्वारा Xcode के पास नहीं है मैं somethings की कोशिश करेंगे:

हो सकता है कि आप अपने कोड में निम्नलिखित की तरह कुछ की कोशिश कर सकते। उम्मीद है कि यह आपको सही दिशा में जाने के लिए कुछ सुराग देता है।

0

आप अपने सर नियंत्रक को कहां बना रहे/कॉन्फ़िगर कर रहे हैं? कोर डेटा स्टैक अभी तक तैयार नहीं हो सकता है, इसलिए [self प्रबंधितObjectContext] पर आपका कॉल शून्य वापस आ सकता है।

इसके अलावा, तुम क्यों यह प्रोग्राम के रूप में यदि आप इसे बस इंटरफ़ेस बिल्डर के साथ ठीक कर सकते हैं बना रहे हैं? उपकरण वहां है और अच्छी तरह से काम करता है (और कई संभावित कोडिंग त्रुटियों को समाप्त करता है), इसलिए जब तक आपके पास इसका उपयोग न करने का कोई अच्छा कारण न हो, तो आप स्वयं को कोई भी काम नहीं कर रहे हैं।

+0

ठीक है मेरे मामले में मैं आईबी का उपयोग करते समय कोड में एनएसएआरएआर कंट्रोलर बनाता हूं, एनएसएआरएआरई कंट्रोलर में डेटा बाध्य नहीं किया गया है, अभी तक 'जागृत FromNib' विधि में लोड नहीं किया गया है। क्या आप आईबी में समस्या को हल करने के बारे में जानते हैं? – xyz

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