2010-01-10 20 views
6

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

मुझे UITableView के साथ कुछ परेशानी हो रही है। असल में, मेरे पास एक सारणी है जिसमें प्रति वर्ग अधिकतम 6 पंक्तियां होनी चाहिए, न्यूनतम नहीं है (सिवाय इसके कि यदि 1-पंक्ति अनुभाग की पंक्ति हटा दी जाती है, तो उस स्थिति में अनुभाग इसके साथ चला जाता है)। तालिका को उपयोगकर्ता द्वारा भी पुन: व्यवस्थित किया जा सकता है। जब उपयोगकर्ता एक पंक्ति में एक पंक्ति को ड्रैग करता है जिसमें पहले से अधिकतम 6 आवंटित पंक्तियां होती हैं, तो मैं उस खंड की निचली पंक्ति को अगले खंड की शीर्ष पंक्ति बनने के लिए 'बज' को क्रमबद्ध करने के लिए चाहता हूं।

इसे लागू करने के लिए, मेरा पहला विचार tableView:moveRowAtIndexPath:toIndexPath: में एक विधि को कॉल करना था जो लूप में सेक्शन के माध्यम से जाएगा, यह सुनिश्चित कर लें कि उनमें से कोई भी 7+ पंक्तियां नहीं है, आवश्यकतानुसार सरणी को समायोजित कर रहा है, और उसके बाद [myTable beginUpdates] आवश्यक पंक्तियों को हटाने और डालने के लिए ब्लॉक। (: मेरे सरणी संरचना है: टिप्पणी सरणी (तालिका)> सरणी (धारा)> शब्दकोश (आइटम)): यह क्या वह सब की तरह लग रहा है

-(void) tableView: (UITableView *) tableView moveRowAtIndexPath: (NSIndexPath *) from toIndexPath: (NSIndexPath *) to 
{ 
// Get the dictionary object for the icon. 
NSMutableDictionary *theIcon = [[[TABLE_ARRAY_MACRO objectAtIndex: from.section] objectAtIndex: from.row] mutableCopy]; 

// Now remove it from the old position, and insert it in the new one. 
[[TABLE_ARRAY_MACRO objectAtIndex: from.section] removeObjectAtIndex: from.row]; 
[[TABLE_ARRAY_MACRO objectAtIndex: to.section] insertObject: theIcon atIndex: to.row]; 

if ([[TABLE_ARRAY_MACRO objectAtIndex: to.section] count] > 6) 
      [self budgeRowsAtSection: to.section]; 

// Now we're done with the dictionary. 
[theIcon release]; 

if (PM_DEBUG_MODE) 
    NSLog(@"Pet moved!"); 
} 



-(void) budgeRowsAtSection: (NSUInteger) section 
{ 
    if (PM_DEBUG_MODE) 
    NSLog(@"Budging rows..."); 

    // Set up an array to hold the index paths of the cells to move. 
    NSMutableArray *budgeFrom = [[NSMutableArray alloc] init]; 
    NSMutableArray *budgeTo = [[NSMutableArray alloc] init]; 

    // Start at the current section, and enumerate down to the nearest page with < 6 items. 
    int i = section; 

while (i < [TABLE_ARRAY_MACRO count]) { 

    if (PM_DEBUG_MODE) 
     NSLog(@"Attempting to budge rows in section %i!", i); 

    if ([[TABLE_ARRAY_MACRO objectAtIndex: i] count] > 6) { 

    // Grab the last object, and move it to the beginning of the next array. 
    NSMutableDictionary *lastIcon = [[[PET_ICON_DATA objectAtIndex: i] lastObject] mutableCopy]; 

    [[TABLE_ARRAY_MACRO objectAtIndex: i] removeLastObject]; 
    [[TABLE_ARRAY_MACRO objectAtIndex: (i + 1)] insertObject: lastIcon atIndex: 0]; 

    // Create an index path, and reflect the changes in the table. 
    [budgeFrom addObject: [NSIndexPath indexPathForRow: 6 inSection: i]]; 
    [budgeTo addObject: [NSIndexPath indexPathForRow: 0 inSection: (i + 1)]]; 

    // Now we're done with the icon. 
    [lastIcon release]; 

} 

if (PM_DEBUG_MODE) 
     NSLog(@"Rows budged for section %i!", i); 

++i; 

} 

    if (PM_DEBUG_MODE) 
    NSLog(@"From cells: %@\nTo cells: %@", budgeFrom, budgeTo); 

    if (PM_DEBUG_MODE) 
    NSLog(@"Data budged! Updating table..."); 

    [editTable beginUpdates]; 
    [editTable deleteRowsAtIndexPaths: budgeFrom withRowAnimation: UITableViewRowAnimationBottom]; 
    [editTable insertRowsAtIndexPaths: budgeTo withRowAnimation: UITableViewRowAnimationTop]; 
    [editTable endUpdates]; 

    [budgeFrom release]; 
    [budgeTo release]; 

    if (PM_DEBUG_MODE) 
    NSLog(@"Row budge done!"); 
} 

जब मैं इस चलाने समस्या है, यह हमेशा एक फेंकता अपवाद; यह मुझे या तो Invalid update: number of rows in section after update must be equal to number of rows before update, + or - the number inserted or deleted (etc.), या Attempted to create two animations for cell देता है, इस पर निर्भर करता है कि मैं किस ट्विक की कोशिश कर रहा हूं। उन बदलावों के लिए, मैंने reloadSections:withRowAnimation: का उपयोग करने का भी प्रयास किया है, और निश्चित रूप से एक सरल [editTable reloadData]। मैंने इस विधि को प्रासंगिक तालिका दृश्य प्रतिनिधि/डेटा स्रोत विधियों में कॉल करने की कोशिश की है, जिसमें targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath: और कुछ हद तक रहस्यमय willMoveToRowAtIndexPath:fromIndexPath: विधि है जो तालिका दृश्यों पर ऐप्पल मार्गदर्शिका में उल्लिखित है, लेकिन यह कहीं और मौजूद नहीं है।

मैंने समाधान के किसी भी स्याही के लिए पूरे Google, इस साइट और ऐप्पल के दस्तावेज़ों की खोज की है, लेकिन इसका कोई फायदा नहीं हुआ है।

तो, मेरे प्रश्न को बस रखने के लिए, इस बारे में जाने का सबसे अच्छा तरीका क्या है? क्या कोई स्पष्ट चीज है जिसे मैं देख रहा हूं? या मेरी कार्यान्वयन अवधारणा सिर्फ मौलिक रूप से गड़बड़ी से त्रुटिपूर्ण है?

मदद के लिए अग्रिम धन्यवाद! किसी भी जानकारी के लिए बहुत सराहना की जाएगी।

- ड्रू आर हूड

अद्यतन: अपने जवाब पर उसकी टिप्पणी से जॉर्डन के सलाह के बाद, मैं सत्यापित किया है कि डेटा स्रोत पर वास्तविक संपादन सही ढंग से के माध्यम से जा रहे हैं। जब मैं तालिका को ब्लॉक निष्पादित करता हूं (सामान्य ज्ञान और ब्रेकपॉइंट्स द्वारा सत्यापित समय) को अब मुझे त्रुटि Attempt to create two animations for cell त्रुटि मिलती है। तो मैं अपने संपादन ब्लॉक में कुछ गलत कर रहा हूँ। इसके लिए वर्तमान कोड बिल्कुल दिखाया गया है जैसा कि ऊपर दिखाया गया है। विचार?

उत्तर

0

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

-(void) performBudges 
{ 
if (PM_DEBUG_MODE) 
    NSLog(@"Performing budge animations..."); 

[editTable beginUpdates]; 
[editTable deleteRowsAtIndexPaths: budgeFrom withRowAnimation: UITableViewRowAnimationRight]; 
[editTable insertRowsAtIndexPaths: budgeTo withRowAnimation: UITableViewRowAnimationRight]; 
[editTable endUpdates]; 

[editTable performSelector: @selector(reloadData) withObject: nil afterDelay: 0.5]; 

[reloadedSections release]; 

[budgeFrom release]; 
[budgeTo release]; 

if (PM_DEBUG_MODE) 
    NSLog(@"Budges completed!"); 
} 

और यह सब मैं यह मेरा moveRowAtIndexPath: विधि में इस स्निपेट शामिल है प्रदर्शन करने के लिए क्या करना है:

if ([[PET_ICON_DATA objectAtIndex: to.section] count] > 6) { 

    [self budgeRowsAtSection: to.section]; 
    [self performSelector: @selector(performBudges) withObject: nil afterDelay: 1.0]; 

} 

तो मुझे आशा है कि यह किसी को जो हो सकता है में मदद करता है भविष्य में यह समस्या। जॉर्डन के लिए धन्यवाद और सभी जिन्होंने इस प्रश्न को देखा। :)

2

[संपादित करने योग्य प्रारंभ अद्यतन]; [संपादित करें deleteRowsAtIndexPaths: budge से के साथ RowAnimimation: UITableViewRowAnimationBottom];
[संपादित करेंटेबल insertRowsAtIndexPaths: budgeToRowAnimation: UITableViewRowAnimationTop];
[संपादित करेंटेबल एंडअपडेट्स];

मैं तुम्हें डेटास्रोत अद्यतन करने के लिए इससे पहले कि आप वास्तव में जो कुछ भी खंड आप से हटाने रहे हैं में पंक्ति हटाना होगा विश्वास करते हैं।तो इस कोड में, हटाने से पहले, Table_Array_Macro से पंक्ति हटाएं (जो मुझे लगता है कि आपका डेटा कहां है)।

+0

प्रतिक्रिया के लिए धन्यवाद। यह है, और मैंने किया - ऊपर कहां कहता है: [[TABLE_ARRAY_MACRO ऑब्जेक्टएटइंडेक्स: i] हटाएं LastObject]; [[TABLE_ARRAY_MACRO ऑब्जेक्टएट इंडेक्स: (i + 1)] insertObject: lastIcon atndex: 0]; स्पष्टीकरण के लिए, मेरा डेटा स्रोत सरणी (प्रति अनुभाग एक सरणी) की एक सरणी है, और उन सरणी में तालिका कक्षों के लिए वास्तविक जानकारी वाले शब्दकोष हैं। – FrigginGuy

+0

पहले और बाद में रिकॉर्ड की संख्या गिनने के लिए एनएसएलओजी जोड़ने का प्रयास करें। मुझे यकीन है कि वहाँ एक मेल नहीं है। त्रुटि यह है कि त्रुटि संचार कर रहा है। – Jordan

+0

मैंने आपकी सलाह का पालन किया और मेरी सरणी आवश्यकतानुसार बदल दी जा रही है। मैंने सुनिश्चित किया कि दोनों मायने रखता है और सामग्री ठीक से मेल खाती है। सबकुछ जांचता है। अब मुझे मिली एकमात्र त्रुटि 'सेल के लिए दो एनिमेशन बनाने का प्रयास' है, इसलिए ऐसा लगता है कि मेरी समस्या मेरे संपादन ब्लॉक में होती है। : - / – FrigginGuy

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