8

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

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section; 
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView; 

मैं भी एक UITableView कि अनुक्रमण का उपयोग किए बिना कोर डाटा के द्वारा समर्थित है को लागू करने कोई समस्या नहीं है।

जो मैं समझने की कोशिश कर रहा हूं वह है कि दोनों को सुंदर ढंग से कैसे जोड़ना है? स्पष्ट रूप से जब आप इंडेक्स और पुन: सेक्शन सामग्री को एक बार देखते हैं, तो आप किसी दिए गए इंडेक्स पथ पर चीजों को पुनर्प्राप्त करने के लिए मानक NSFetchedResultsController का उपयोग नहीं कर सकते हैं। इसलिए मैं अपने इंडेक्स अक्षरों को एक एनएसएआरएआरई और एनएस डिक्शनरी में मेरी अनुक्रमित सामग्री में संग्रहीत कर रहा हूं। यह सभी प्रदर्शन के लिए ठीक काम करता है, लेकिन मैं कुछ असली सिरदर्द जब यह बताया और पंक्तियों को हटाने की बात आती है विशेष रूप से कैसे ठीक इन तरीकों को लागू करने के लिए है:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller; 

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath; 

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type; 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller; 

क्योंकि सूचकांक रास्तों यह मुझे लौटा रहा है लोगों के साथ कोई संबंध है कोर डेटा में। जब मैं एक पंक्ति जोड़ता हूं तो मैं अपने इंडेक्स एनएसएआरएआरई और एनएस डिक्शनरी को पुनर्निर्माण करके काम करना जोड़ता हूं, लेकिन जब वे हटाते हैं तो पूरे एप्लिकेशन को क्रैश करते हैं।

क्या कोई साधारण पैटर्न/उदाहरण है क्या मैं यह सब ठीक से काम करने के लिए यहां लापता हूं?

संपादित करें: बस स्पष्ट करने के लिए मुझे पता है कि NSFetchedResultsController यह बॉक्स से बाहर करता है, लेकिन मैं चाहता हूं कि संपर्क ऐप जैसी कार्यक्षमता को दोहराना है, जहां सूचकांक व्यक्ति के पहले नाम का पहला अक्षर है।

उत्तर

20

आपको अपने अनुभाग/अनुक्रमणिका प्राप्त करने के लिए अपने कोरडाटा NSFetchedResultsController का उपयोग करना चाहिए।
आप लाने का अनुरोध में खंड कुंजी निर्दिष्ट कर सकते हैं (मुझे लगता है कि यह पहली बार तरह कुंजी से मेल खाना चाहिए): तो फिर

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] 
initWithKey:@"name" // this key defines the sort 
ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext 
sectionNameKeyPath:@"name" // this key defines the sections 
cacheName:@"Root"]; 
aFetchedResultsController.delegate = self; 
self.fetchedResultsController = aFetchedResultsController; 

, तो आप इस तरह अनुभाग नाम प्राप्त कर सकते हैं:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section]; 
    return [sectionInfo name]; 
} 

और अनुभाग अनुक्रमित यहां हैं:

सामग्री के लिए
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section]; 
[sectionInfo indexTitle]; // this is the index 

परिवर्तन सिर्फ संकेत मिलता है कि तालिका अपडेट करने की आवश्यकता:

01,235,
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    [self.tableView reloadData]; 
} 

अद्यतन
सूचकांक और तेजी से सूचकांक स्क्रॉल, खंड हेडर के लिए नहीं करने के लिए यह केवल काम करता है।
अनुभाग शीर्षलेखों के साथ-साथ इंडेक्स के लिए पहले अक्षरों को कार्यान्वित करने के तरीके के बारे में अधिक जानकारी और विवरण के लिए "अनुभाग अनुभाग के रूप में पहले वर्ण का उपयोग कैसे करें" के लिए this answer देखें।

+0

मुझे लगता है कि मैंने खुद को पर्याप्त स्पष्ट नहीं किया है। मैं चाहता हूं कि मेरी इंडेक्स संपर्क ऐप की तरह हों, व्यक्तियों का पहला अक्षर पहले नाम। – rustyshelf

+0

तो, प्रथम नाम का उपयोग क्यों नहीं किया गया है NameNameKeyPath काम करता है? – gerry3

+0

सेक्शननामकेपथ !??!? !?? बिल्ली ने मुझे कैसे याद किया! वाह जो शानदार काम करता है। मुझे अपने कोडिंग से पहले डॉको को बेहतर पढ़ना चाहिए था ... उस पर वापस आ गया है और यह मीठा काम कर रहा है। अगर मैं कर सकता तो मैं आपको +5000 दूंगा;) – rustyshelf