2009-01-28 15 views
6

पंक्तियों नामक तारों के एनएसएमयूटेबलएरे का उपयोग करने के एक साधारण उदाहरण के लिए, तालिका तालिका को स्थानांतरित करने के लिए मुझे अपने टेबल नियंत्रक में क्या लागू करना होगा और मेरे सरणी में परिवर्तनों को प्रतिबिंबित करना होगा?UITableView पंक्तियों को पुन: व्यवस्थित करने के लिए मुझे किन तरीकों को लागू करना है?

उत्तर

14

यहां हम अपने भारी भारोत्तोलन करते हैं।

- (void)tableView:(UITableView *)tableView 
moveRowAtIndexPath:(NSIndexPath *)fromIndexPath 
     toIndexPath:(NSIndexPath *)toIndexPath 
{ 
    NSLog(@"move from:%d to:%d", fromIndexPath.row, toIndexPath.row); 
    // fetch the object at the row being moved 
    NSString *r = [rows objectAtIndex:fromIndexPath.row]; 

    // remove the original from the data structure 
    [rows removeObjectAtIndex:fromIndexPath.row]; 

    // insert the object at the target row 
    [rows insertObject:r atIndex:toIndexPath.row]; 
    NSLog(@"result of move :\n%@", [self rows]); 
} 

चूंकि यह एक मूल उदाहरण है, इसलिए सभी पंक्तियों को स्थानांतरित करने दें।

- (BOOL)tableView:(UITableView *)tableView 
canMoveRowAtIndexPath:(NSIndexPath *)indexPath { 
    return YES; 
} 
+0

जब निकालें ऑब्जेक्टएटइंडेक्स कहा जाता है, तो क्या उस ऑब्जेक्ट की संदर्भ गणना को कम कर देगा (और शायद इसे हटाया जा सकता है)? मुझे लगता है ExchangeObjectAtIndex: withObjectAtIndex: (जैसा कि @dreamlax द्वारा सुझाया गया है) सुरक्षित है। –

+0

बीटीडब्ल्यू, यदि आप अपने स्वयं के प्रश्न का उत्तर दे रहे हैं, तो मुझे लगता है कि यह विकी बनाने के लिए एक अच्छा रूप है। –

+0

@ क्रिस्टोफर जोहानसन 'एक्सचेंजऑब्जेक्टएट इंडेक्स: withObjectAtIndex: 'इस मामले में उपयुक्त नहीं है। इसमें 'tableView: moveRowAtIndexPath: toIndexPath:' द्वारा आवश्यक लोगों से अलग अर्थशास्त्र हैं। – Benjohn

0

NSMutableArray एक विधि exchangeObjectAtIndex:withObjectAtIndex: कहा जाता है।

+3

मैंने इसे आजमाया है, लेकिन व्यवहार अलग है।तालिका पंक्तियों का आदान-प्रदान नहीं करती है, यह एक पंक्ति को हटा देती है, फिर इसे एक अलग स्थान पर डालती है। यदि मैं इस विधि का उपयोग करता हूं, तो तालिका और बैकिंग स्टोर प्रत्येक चाल के साथ समन्वयित हो जाता है। –

11

उपर्युक्त में से कोई भी काम नहीं करेगा। मूल पोस्ट कोड में, तालिकादृश्य क्रैश हो जाएगा क्योंकि यह उस डेटा को हटा देता है जो अभी भी उपयोग में लाएगा, और इसके बाद भी इसे ठीक किया गया था, तालिका के 'पुनर्व्यवस्थित' के तरीके के कारण सरणी में सही डेटा नहीं होगा।

exchangeObjectAtIndex: withObjectAtIndex: कैसे एक tableview

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

समाधान: तालिकादृश्य एक पुनर्व्यवस्थित लागू करने के तरीके के कारण, हमें यह सुनिश्चित करने के लिए एक जांच करने की आवश्यकता है कि हम सही पंक्ति को जोड़ और हटा दें। यह कोड मैंने एक साथ रखा है सरल है और मेरे लिए सही काम करता है।

एक उदाहरण के रूप मूल पोस्ट कोड डेटा का उपयोग करना:


- (void)tableView:(UITableView *)tableView 
moveRowAtIndexPath:(NSIndexPath *)fromIndexPath 
     toIndexPath:(NSIndexPath *)toIndexPath 
{ 
    NSLog(@"move from:%d to:%d", fromIndexPath.row, toIndexPath.row); 
    // fetch the object at the row being moved 
    NSString *r = [rows objectAtIndex:fromIndexPath.row]; 

     // checks to make sure we add and remove the right rows 
    if (fromIndexPath.row > toIndexPath.row) { 

     // insert the object at the target row 
     [rows insertObject:r atIndex:toIndexPath.row]; 

     // remove the original from the data structure 
     [rows removeObjectAtIndex:(fromIndexPath.row + 1)]; 
    } 
    else if (fromIndexPath.row < toIndexPath.row) { 

     // insert the object at the target row 
     [rows insertObject:r atIndex:(toIndexPath.row + 1)]; 

     // remove the original from the data structure 
     [rows removeObjectAtIndex:(fromIndexPath.row)]; 

    } 

} 

आप कुछ ही क्षणों लेने के लिए और क्या एक पुनर्व्यवस्थित दौरान एक tableview के लिए होता पर एक नज़र डालें तो आप समझ जायेंगे कि हम क्यों जोड़ने 1 की जहां हम किया।

मैं एक्सकोड के लिए काफी नया हूं, इसलिए मुझे पता है कि ऐसा करने का शायद एक आसान तरीका है, या कोड शायद सरलीकृत हो सकता है .... बस यह जानने में मदद कर रहा हूं कि मैं कहां कर सकता हूं क्योंकि यह मुझे कुछ ले गया है इसे समझने के लिए घंटे। उम्मीद है कि यह किसी को कुछ समय बचाता है!

NSObject *tempObj = [[self.rows objectAtIndex:fromIndexPath.row] retain]; 
[self.rows removeObjectAtIndex:fromIndexPath.row]; 
[self.rows insertObject:tempObj atIndex:toIndexPath.row]; 
[tempObj release]; 
+1

यह तालिका दृश्य और एनएसएमयूटेबलएरे – wayneh

+1

थैंक्स विज़ के संयोजन के लिए सही जवाब है। आपका कोड पूरी तरह से काम करता है और समझ में आता है। – Ali

5

एप्पल के प्रलेखन, और मेरे अपने अनुभव के अनुसार, इस के लिए कुछ सरल कोड है कि बहुत अच्छी तरह से काम करता है मेरे लिए सबसे अच्छा, ऐप्पल तरीका, बस एआरसी का उपयोग करते समय बनाए रखने और रिलीज को हटाने के लिए याद रखें। तो, एक संक्षिप्त संक्षिप्त समाधान

NSObject *tempObj = [self.rows objectAtIndex:fromIndexPath.row]; 
[self.rows removeObjectAtIndex:fromIndexPath.row]; 
[self.rows insertObject:tempObj atIndex:toIndexPath.row]; 
+0

अच्छा जवाब। आप सभी का सबसे सही है। धन्यवाद दोस्त! – GeneCode

0

मिले एक सरल कार्यान्वयन के खिलाफ मेरे सिर तोड़ने के बाद इस चर्चा ... माइकल Berding समाधान है:

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

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