2012-09-29 23 views
11

से अलग सॉर्ट ऑर्डर समूहबद्ध UITableView में अनुभागों के लिए मेरे पास एक NSManagedObject है। इस ऑब्जेक्ट में गुण "नाम" और "बनाया गया" है। मैं अनुभाग शीर्षक के लिए ते यूआई में "नाम" का उपयोग करना चाहता हूं, लेकिन "बनाया गया" द्वारा क्रमबद्ध किया गया है। दस्तावेज़ीकरण के अनुसार पहली तरह से डिस्क्रिप्टर कुंजी को NSFetchedResultsController के अनुभागNameKeyPath भी होना चाहिए।NSFetchedResultsController - अनुभाग नाम

मैंने दो प्रकार के डिस्क्रिप्टर का उपयोग करने का सुझाव दिया, लेकिन यह काम नहीं करता है। खंड अभी भी नाम से क्रमबद्ध हैं।

- (NSFetchedResultsController *)fetchedResultsController { 
    if (_fetchedResultsController != nil) { 
     return _fetchedResultsController; 
    } 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Object" inManagedObjectContext:[CoreDataHelper instance].managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    NSSortDescriptor *sortName = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 
    NSSortDescriptor *sortDate = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:YES]; 

    [fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortName, sortDate, nil]]; 

    [fetchRequest setFetchBatchSize:20]; 

    NSFetchedResultsController *theFetchedResultsController = 
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
            managedObjectContext:[CoreDataHelper instance].managedObjectContext sectionNameKeyPath:@"name" 
               cacheName:@"Root"]; 
    self.fetchedResultsController = theFetchedResultsController; 

    return _fetchedResultsController; 
} 

उत्तर

38

एक प्राप्त किए गए परिणाम नियंत्रक (एफआरसी) समूह (और तरह) के लिए केवल पहले प्रकार वर्णनकर्ता वर्गों में वस्तुओं का उपयोग करता है। प्रत्येक खंड में ऑब्जेक्ट्स को सॉर्ट करने के लिए एक दूसरा सॉर्ट डिस्क्रिप्टर जोड़ा जा सकता है।

इसके अलावा, सॉर्ट डिस्क्रिप्टर का मुख्य पथ एफआरसी के sectionNameKeyPath के समान होना चाहिए (या कम से कम एक ही रिश्तेदार क्रम उत्पन्न करना)।

आपके मामले में, आप इस प्रकार आगे बढ़ सकते हैं:

  1. उपयोग createdAtsectionNameKeyPath रूप और पहले प्रकार वर्णनकर्ता में।
  2. titleForHeaderInSection प्रतिनिधि समारोह को संशोधित createdAt के बजाय name संपत्ति वापस करने के लिए:

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

नोट: आप एक ही name लेकिन अलग createAt मानों के साथ कई वस्तुओं है, तो निम्न समूह में रखा जाएगा उपर्युक्त दृष्टिकोण के साथ विभिन्न वर्गों में। मुझे नहीं पता कि यह आपके लिए एक समस्या है या नहीं।

+0

बढ़िया! यह इतना आसान हो सकता है। नहीं, मैं कई प्रकार के डिस्क्रिप्टरों के फ़ंक्शन को भी समझता हूं। वर्तमान में मेरी वस्तुओं का "नाम" अद्वितीय है, इसलिए यह समाधान कोई समस्या नहीं है। कोड के लिए भी धन्यवाद। – Sebastian

+0

@ सेबेस्टियन: आपका स्वागत है। –

+0

उत्तर के लिए धन्यवाद। – coreDeviOS

0

आप लगभग वहां हैं। आपको अपने initWithFetchRequest कॉल में सेक्शननामपैथ को परिभाषित करने की आवश्यकता है।

NSSortDescriptor *sortDate = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:YES]; 
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDate]]; 

    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[CoreDataHelper instance] sectionNameKeyPath:@"name"]; 
संबंधित मुद्दे