2010-03-02 12 views
25

मुझे पता है कि इस सवाल से पहले पूछा गया है, और मैंने this question के उत्तर पर एक नज़र डाली। हालांकि, मैं अभी भी उलझन में हूं कि एक कोर डेटा प्रोजेक्ट में UITableView के साथ पुन: समन्वय कैसे कार्यान्वित किया जाए। मुझे क्या पता है कि वस्तुओं के क्रम को ट्रैक करने के लिए मुझे अपनी इकाई में "डिस्प्ले ऑर्डर" विशेषता है, और मुझे प्राप्त परिणामों में सभी ऑब्जेक्ट्स के माध्यम से गणना करने और उनके प्रदर्शन ऑर्डर विशेषता सेट करने की आवश्यकता है।UITableView कोर डेटा रीडरिंग

मेरे द्वारा लिंक किए गए प्रश्न में दिए गए कोड में, तालिका दृश्य प्रतिनिधि विधि इस [self FF_fetchResults]; जैसी विधि को कॉल करती है, और उस विधि के लिए कोड नहीं दिया जाता है, इसलिए यह कहना मुश्किल है कि यह वास्तव में क्या है।

क्या कोई नमूना कोड है जो इसे प्रदर्शित करता है? कोड के बड़े हिस्से को साझा करने से देखना आसान होगा।

धन्यवाद

+0

आप लिंक किए गए कोड की कोशिश की? यदि आप एक प्राप्त परिणाम नियंत्रक का उपयोग कर रहे हैं, तो आपको कुछ भी करने की आवश्यकता नहीं हो सकती है। वह विधि सिर्फ ऑब्जेक्ट्स को फिर से ला रही है (अब यह सॉर्ट बदल गया है)। – gerry3

+0

धन्यवाद, मैं इसे आज़माउंगा। आदेश बदलने के बाद वस्तुओं को फिर से लाने के लिए जरूरी है? – indragie

+0

यदि आप किसी प्राप्त परिणाम नियंत्रक का उपयोग कर रहे हैं (और बॉयलर प्लेट कोड को तालिका दृश्य को अपडेट करने के लिए बॉयलर प्लेट कोड प्राप्त करने की आवश्यकता नहीं है, तो प्राप्त परिणाम नियंत्रक बदलते हैं)। – gerry3

उत्तर

56

मुझे यकीन है कि आप किस भाग के साथ परेशानी (टिप्पणी के आधार पर) कर रहे हैं नहीं कर रहा हूँ ... लेकिन यहाँ मेरी सुझाव है। डिस्प्ले ऑर्डर एनएसएमएनेज्ड ऑब्जेक्ट क्लास पर सिर्फ एक साधारण विशेषता है। यदि आप एक प्रबंधित ऑब्जेक्ट को सहेज सकते हैं, तो आप इस सुविधा को पूरा कर पाएंगे। पहले एक सरल NSManagedObject लेने की सुविधा देता है:

@interface RowObj : NSManagedObject 
{ 
} 

@property (nonatomic, retain) NSString *rowDescription; 
@property (nonatomic, retain) NSNumber *displayOrder; 

इसके बाद, हम डेटा की स्थानीय प्रतिलिपि tableview में प्रदर्शित किया जा रहा है की जरूरत है। मैंने आपके द्वारा की गई टिप्पणियों के माध्यम से पढ़ा है और मुझे वास्तव में यकीन नहीं है कि क्या आप FetchedResultsController का उपयोग कर रहे हैं या नहीं। मेरा सुझाव सरल शुरू करना होगा और केवल सामान्य टेबलव्यू कंट्रोलर का उपयोग करना होगा जहां उपयोगकर्ता जब भी प्रदर्शन ऑर्डर बदलता है तो आप पंक्ति डेटा अपडेट करते हैं ... फिर उपयोगकर्ता को संपादन करने पर ऑर्डर को सहेजें।

इस tableviewcontoller के लिए इंटरफ़ेस इस प्रकार दिखाई देगा:

@interface MyTableViewController : UITableViewController { 
    NSMutableArray *myTableViewData; 
} 

@property(nonatomic,retain) NSMutableArray *myTableViewData; 

@end 

इसके बाद, हम viewWillAppear विधि में तालिका दृश्य डेटा लोड करने की आवश्यकता है:

- (void)viewWillAppear:(BOOL)animated { 
    myTableViewData = [helper getRowObjects]; // insert method call here to get the data 
    self.navigationItem.leftBarButtonItem = [self editButtonItem]; 
} 

2 बातों पर जा रहा हैं यहां ... (मैं बाद में संपादन बटन को समझाऊंगा) पहला यह है कि हमें कोरडाटा से अपना डेटा प्राप्त करने की आवश्यकता है। जब मुझे ऐसा करना होता है तो मेरे पास कुछ प्रकार का सहायक होता है (जिसे आप चाहते हैं उसे कॉल करें) ऑब्जेक्ट काम करता है। एक ठेठ खोज विधि इस प्रकार दिखाई देगा:

- (NSMutableArray*) getRowObjects{ 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"RowObj" inManagedObjectContext:[self managedObjectContext]]; 
    [request setEntity:entity]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"displayOrder" ascending:YES]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
    [request setSortDescriptors:sortDescriptors]; 
    [sortDescriptors release]; 
    [sortDescriptor release]; 

    NSError *error; 
    NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
    if (mutableFetchResults == nil) { 
     // Handle the error. 
    } 
    [request release]; 
    return mutableFetchResults; 
} 

अब आप अपने डेटा हमारे पास है, अब आप तालिका संपादित करने के लिए उपयोगकर्ता के लिए प्रतीक्षा कर सकते हैं। यही वह जगह है जहां [स्वयं संपादनबटन Item] खेल में आता है। यह एक अंतर्निहित सुविधा है जो एक बार बटन आइटम देता है जो संपादन और पूर्ण के बीच अपने शीर्षक और संबंधित स्थिति को टॉगल करता है। जब उपयोगकर्ता उस बटन को हिट करता है, तो यह सेट एडिटिंग: एनिमेटेड: विधि:

डिस्प्ले ऑर्डर को अपडेट करने के लिए आपको UITableViewController क्लास पर सेट एडिटिंग विधि को ओवरराइड करने की आवश्यकता है। यह कुछ इस तरह दिखना चाहिए:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated { 
    [super setEditing:editing animated:animated]; 
    [myTableView setEditing:editing animated:animated]; 
    if(!editing) { 
     int i = 0; 
     for(RowObj *row in myTableViewData) { 
      row.displayOrder = [NSNumber numberWithInt:i++]; 
     } 
     [helper saveManagedObjectContext]; // basically calls [managedObjectContext save:&error]; 
    } 
} 

हम कुछ भी करने को उपयोगकर्ता संपादन मोड में है जब नहीं है ... हम केवल एक बार वे "पूर्ण" बटन दबाया है सहेजना चाहते हैं। कोई उपयोगकर्ता आपके तालिका में एक पंक्ति खींच लेता है जब आप canMoveRowAtIndexPath और moveRowAtIndexPath तरीकों अधिभावी करके अपने प्रदर्शन आदेश को अपडेट कर सकते हैं: फिर

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { 
    return true; 
} 

(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath { 

    RowObj *row = [myTableViewData objectAtIndex:sourceIndexPath.row]; 
    [myTableViewData removeObjectAtIndex:sourceIndexPath.row]; 
    [myTableViewData insertObject:row atIndex:destinationIndexPath.row]; 
} 

, उपयोगकर्ता में अब भी है क्योंकि कारण मैं यहाँ displayOrder मूल्य अद्यतन नहीं करते है संपादन मोड...हम नहीं जानते कि उपयोगकर्ता संपादन कर रहा है और वे "पूर्ण" बटन पर क्लिक न करके किए गए कार्यों को भी रद्द कर सकते हैं।

संपादित

आप एक पंक्ति आप ओवरराइड tableView की जरूरत को हटाना चाहते हैं: commitEditingStyle: forRowAtIndexPath और कुछ इस तरह करते हैं:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     // Delete the managed object at the given index path. 
     RowObj *row = [myTableViewData objectAtIndex:indexPath.row]; 
     [helper deleteRow:row]; 

     // Update the array and table view. 
     [myTableViewData removeObjectAtIndex:indexPath.row]; 
     [myTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES]; 
    } 
} 
+0

विस्तृत उत्तर के लिए धन्यवाद, मैं इसे आजमाउंगा। – indragie

+0

निश्चित रूप से, अगर आपको कोई समस्या है तो मुझे बताएं ... यह मूल रूप से शब्द -4-शब्द है जो मेरे ऐप्स में से एक से कार्यान्वित कार्यान्वयन से है, इसलिए इसे करने में आपकी सहायता करनी चाहिए। –

+0

पंक्तियों को हटाने के बारे में क्या? क्या इस बात के साथ काम करने के लिए कुछ खास किया जाना चाहिए? – indragie