2011-11-21 11 views
6

मेरे पास कुछ रीति-रिवाज UITableCells युक्त UITable है। उन कोशिकाओं में कुछ UILabels और UITextField होते हैं। तालिका का डेटासोर्स मुख्य नियंत्रक की संपत्ति से आता है। (यह नियंत्रक भी प्रतिनिधि के लिए प्रतिनिधि और डेटा स्रोत है)। अब मैं उपयोगकर्ता UITextFields में से एक को संपादित करता है जब सभी UILabels की सामग्री "मक्खी पर" अद्यतन करने की आवश्यकताकोशिकाओं में से किसी एक के अंदर UITextField को संपादित करते समय फ्लाई पर एक यूआईटीबल को दोबारा लोड करें

schreenshot

,:

यहाँ यूआई का एक सरलीकृत स्क्रीनशॉट है। ऐसा करने के लिए, मैं UITextField स्तर पर "संपादन बदल गया" ईवेंट सुन रहा हूं।

- (IBAction) editChangeHandler: (id) sender { 
    MyAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
    [[delegate.viewController.myDataSourceArray objectAtIndex:self.rowIndex] setANumber: [theTextField.text intValue]]; 
    [delegate.viewController reloadRows]; 
} 

ViewController में reloadRows विधि जैसे है:

- (void) reloadRows { 
    NSLog(@"called reloadRows"); 
    //perform some calculations on the data source objects here... 
    [theUITable reloadData]; 
} 

यहाँ मेरी समस्या है कि जब भी उपयोगकर्ता फ़ील्ड में मान बदलता है, reloadRows विधि सफलतापूर्वक है यह निम्न कार्रवाई से चलाता है कहा जाता है, तो जाहिर है reloadData लेकिन यह कुंजीपटल को खारिज कर देता है।

तो अंत में, उपयोगकर्ता कुंजीपटल खारिज होने से पहले टेक्स्टफिल्ड को संपादित करते समय केवल एक कुंजी को स्पर्श कर सकता है और तालिका पुनः लोड हो जाती है।

क्या कोई इस के समाधान को जानता है या एक ही समस्या का अनुभव किया है?

उत्तर

3

आप पूरी तालिका को अपडेट करने के बजाय, आवश्यकतानुसार पंक्तियों को चुनिंदा रूप से संशोधित कर सकते हैं (ऐसा करने से आप उस सेल को अपडेट कर रहे हैं जिसमें आप वर्तमान में काम कर रहे हैं, अपने राज्य को रीसेट कर रहे हैं)।

देखो पर:

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 

साथ ही, आप उन कोशिकाओं को सीधे के माध्यम से सेल प्राप्त करने के द्वारा संपादित कर सकते हैं:

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath 

अगर आप उन कोशिकाओं के पुनर्निर्माण करने के लिए नहीं करना चाहती।

+0

Arf! धन्यवाद ! कुंजीपटल बर्खास्तगी वास्तव में सेल राज्य रीसेटिंग द्वारा समझाया गया था। मैं उसे कैसे नहीं देख सकता था?:-) चूंकि मुझे वर्तमान पंक्ति के लेबल को भी अद्यतन करने की आवश्यकता है, इसलिए मैंने आपके दूसरे सुझाव के बाद समाप्त किया और नियंत्रक में एक नई विधि लिखी जो केवल व्यक्तिगत पंक्तियों के लेबल अपडेट करता है। – Saze

3

मैं एक ही समस्या में भाग गया। मेरे मामले में मैं एक सामान्य नियंत्रक बनाने की कोशिश कर रहा था, इसलिए कोशिकाओं को मैन्युअल रूप से पुनर्निर्माण करने के लिए एक विशिष्ट विधि लिखना एक अच्छा विकल्प नहीं था।

  1. अस्थायी रूप से तालिका में कुछ अन्य सेल में एक पाठ क्षेत्र बनाने के पहले प्रत्युत्तर बन:

    यहाँ समाधान मैं के साथ आया है।

  2. कॉल reloadRowsAtIndexPaths आपके उपयोगकर्ता को संपादित करने वाले सेल को फिर से लोड करने के लिए।
  3. उस क्षेत्र को बनाएं जिसे उपयोगकर्ता संपादित कर रहा था, पहले प्रतिक्रियाकर्ता बन गया।

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

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