2009-04-30 12 views
22

मेरे पास एक ऐसा एप्लिकेशन है जिसमें UITableView है। यह UITableView ऐपडिलेगेट में एक एनएसएमयूटेबलएरे (एक संपत्ति के रूप में) द्वारा पॉप्युलेट किया गया है। आप इसे ईमेल विंडो के रूप में सोच सकते हैं। यह उप-वर्गीकृत UITableViewCell में संदेशों को सूचीबद्ध करता है। जब कोई नया संदेश प्रकट होता है, तो मेरे पास सभी कोड किए गए हैं जो संदेश डाउनलोड करते हैं, डेटा को ऐपडिलेगेट के एनएसएमयूटेबलएरे में जोड़ता है जिसमें सभी संदेश होते हैं। यह कोड ठीक काम कर रहा है।[UITableView reloadData] के साथ क्या है?

अब, जब नया संदेश डाउनलोड हो जाता है और सरणी में जोड़ा जाता है, तो मैं निम्नलिखित कोड का उपयोग करके अपने UITableView को अपडेट करने का प्रयास कर रहा हूं, हालांकि - UITableView के प्रतिनिधि कार्यों को कॉल नहीं किया जाता है।

अजीब चीज तब होती है जब मैं अपने UITableView को ऊपर और नीचे स्क्रॉल करता हूं, प्रतिनिधि विधियों को आखिरकार बुलाया जाता है और मेरे सेक्शन हेडर बदल जाते हैं (वे उस खंड के लिए संदेश गणना दिखाते हैं)। क्या वे रीयल-टाइम में अपडेट नहीं करते हैं और रीफ्रेश ट्रिगर करने के लिए मेरी स्क्रॉलिंग की प्रतीक्षा नहीं करते हैं? इसके अलावा, अनुभाग में नया सेल कभी नहीं जोड़ा गया है !!

कृपया मदद करें !!

AppDelegate कोड:

[self refreshMessagesDisplay]; //This is a call placed in the msg download method 

-(void)refreshMessagesDisplay{ 
    [self performSelectorOnMainThread:@selector(performMessageDisplay) withObject:nil waitUntilDone:NO]; 
} 

-(void)performMessageDisplay{ 
    [myMessagesView refresh]; 
} 

UITableViewController कोड:

-(void) refresh{ 
    iPhone_PNPAppDelegate *mainDelegate = (iPhone_PNPAppDelegate *)[[UIApplication sharedApplication] delegate]; 

    //self.messages is copied from appDelegate to get (old and) new messages. 
    self.messages=mainDelegate.messages; 

    //Some array manipulation takes place here. 

    [theTable reloadData]; 
    [theTable setNeedsLayout]; //added out of desperation 
    [theTable setNeedsDisplay]; //added out of desperation 
} 
+2

Dude मैं अपने दर्द महसूस करते हैं, एक ही मुद्दा यहाँ। –

उत्तर

29

एक मानसिक स्वास्थ्य की जांच के रूप में, आप सत्यापित किया है कि theTable उस बिंदु पर नहीं के बराबर नहीं है?

+0

theTable शून्य नहीं है, लेकिन अब जब आप इसका उल्लेख करते हैं, तो यह पता 0x0 के रूप में दिखाता है। आईबीओलेटलेटटेबल आईबी में नियंत्रण से जुड़ा हुआ है, और तालिका इस पूरी प्रक्रिया के माध्यम से दिखाई दे रही है .... – Dutchie432

+7

0x0 वास्तव में शून्य है - तालिका दृश्य निश्चित रूप से मौजूद है, लेकिन इसके लिए आपका पॉइंटर सही ढंग से सेट नहीं किया गया है। दोबारा अपनी नीब की जांच करें। –

+0

यह निश्चित रूप से तब समस्या है। किसी कारण से (सभी कोड को देखे बिना कहना असंभव है) आपके 'theTable' चर शून्य है, इसलिए reloadData संदेश कहीं भी नहीं जा रहा है। – smorgan

0

क्या आपने यह सुनिश्चित करने के लिए अपने रीफ्रेश विधि में ब्रेकपॉइंट सेट करने का प्रयास किया है कि पुनः लोड करने के पहले आपके संदेश सरणी में सही सामग्री है?

+0

हां। उस विधि की कई बार समीक्षा की गई है। मैं अपने ऐरे गिनती में वृद्धि देख सकता हूं, और सभी उचित मूल्यों के साथ डीबगर में भी अपना नया ऑब्जेक्ट (संदेश) देख सकता हूं। आकर्षण – Dutchie432

12

आप पुनः लोडडेटा कॉल पर देरी डालने का प्रयास कर सकते हैं - मुझे एक समान समस्या थी जब मैं कोशिकाओं को पुन: व्यवस्थित करते समय अपडेट करने के लिए अपना टेबलव्यू प्राप्त करने का प्रयास कर रहा था, सिवाय इसके कि अगर ऐप क्रैश हो गया तो मैंने इसे पुनः लोड किया।

तो कुछ इस तरह एक कोशिश के लायक हो सकता है:

ताज़ा विधि:

- (void)refreshDisplay:(UITableView *)tableView { 
    [tableView reloadData]; 
} 

और उसके बाद (माना) एक 0.5 सेकंड की देरी से कॉल करने की:

[self performSelector:(@selector(refreshDisplay:)) withObject:(tableView) afterDelay:0.5]; 

यह आशा है कि काम करता है ...

+0

+1 यह मेरे लिए भी काम करता है। होल्ला! –

+0

+1 जैसे काम करने के लिए –

+0

यह मेरा मुद्दा भी था। मैं NSNotificationCenter अधिसूचना चयनकर्ता के भीतर से डेटा पुनः लोड कर रहा हूं। – NathanAldenSr

6

यदि आप एक प्रेषित विधि के भीतर से ReloadData को कॉल करते हैं, तो इसे निष्पादित करना सुनिश्चित करें एन मुख्य कतार। विधि के रूप में

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) { 

    // hard work/updating here 

    // when finished ... 
    dispatch_async(dispatch_get_main_queue(), ^(void) { 
     [self.myTableView reloadData]; 
    }); 
}); 

..same:

-(void)updateDataInBackground { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) { 

     // hard work/updating here 

     // when finished ... 
     [self reloadTable]; 
    }); 
} 

-(void)reloadTable { 
     dispatch_async(dispatch_get_main_queue(), ^(void) { 
      [myTableView reloadData]; 
     }); 
} 
+1

बिंगो! मैं पृष्ठभूमि धागे पर अद्यतन कर रहा था, जो कुछ भी नहीं करता है। धन्यवाद। – nont

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