2010-02-23 15 views
24

अद्यतन करने के बाद Redraw UITableView मेरे पास एक UITableview है जिसे मैं डेटा async के साथ लोड करता हूं ताकि तालिकादृश्य डेटा के बिना दिखाई दे।
मैंने ReloadData विधि को थक दिया है लेकिन तालिकादृश्य स्क्रॉल होने तक तालिकादृश्य खाली रहता है, अचानक डेटा दिखाई देता है।
वही बात तब होती है जब मैं एक विस्तृत दृश्य के रूप में एक टेबलव्यू लोड करता हूं और वस्तुओं के बीच स्विचिंग करता हूं, प्रीविउड आइटम डेटा पहले दिखाई देता है और जैसे ही मैं तालिका दृश्य में स्क्रॉल करता हूं, यह सही डेटा दिखाता है।
मेरा अनुमान है कि ReloadData विधि ठीक काम करता है, लेकिन मुझे किसी भी तरह से टेबलव्यू को फिर से निकालना होगा, इसे हल करने के तरीके पर कोई सुझाव?डेटा एसिंक

/जिमी

+0

आम तौर पर reloadData विधि तालिकादृश्य दृश्य को रीफ्रेश करें। क्या आप अपने TableViewController कोड का नमूना डाल सकते हैं? –

उत्तर

53

आपने कहा कि आप एसिंक्रोनस रूप से सामग्री को आबाद करने कर रहे हैं, लेकिन आप मुख्य थ्रेड के संदर्भ में reloadData आह्वान किया था? (और धागा है कि सामग्री भरता है के माध्यम से नहीं)

ऑब्जेक्टिव-सी

[yourUITableView performSelectorOnMainThread:@selector(reloadData) 
            withObject:nil 
           waitUntilDone:NO]; 

स्विफ्ट

dispatch_async(dispatch_get_main_queue(), { self.tableView.reloadData() }) 

Monotouch

InvokeOnMainThread(() => this.TableView.ReloadData()); 
+7

धन्यवाद कि इसे हल किया गया है =) मोनोचouch का समाधान है: InvokeOnMainThread (() => this.TableView.ReloadData()); –

+0

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

+0

@ MasonG.Zhwiti: अपने टेबल डेटासोर्स में अपने नंबरऑफ्रोइन इनसेक्शन विधि में ब्रेकपॉइंट सेट करें, और फिर से लोड करेंडेटा के बाद यह जांचता है या नहीं। फिर यदि आप 0 नहीं हैं, तो पंक्तियों की संख्या की जांच करें, फिर यह सेलफॉररोएट इंडेक्स को कॉल करेगा। – yonel

2

मुझे लगता है कि यह पुनः लोड नहीं किया गया था।

जब आप स्क्रीन से बाहर करने के लिए कोशिकाओं स्क्रॉल करें, फिर ...

tableView: cellForRowAtIndexPath:

... बुलाया जाएगा। तो इसे फिर से लोड किया जाएगा।

मुझे लगता है कि UITableView चर मान्य नहीं है।

यदि आप मुख्य दृश्य के रूप में UITableView का उपयोग करते हैं, तो आप इसे आजमा सकते हैं।

[self.view reloadData];

या

[self.tableView reloadData];

4

Yonels जवाब एकदम सही है जब आपके विचार वर्तमान में उपयोगकर्ता को दिखाई देता है (जैसे: उपयोगकर्ता एक पुनः लोड बटन जो अपने UITableView भरता प्रेस।)

हालांकि, अपने डेटा एसिंक्रोनस रूप से भरी हुई है, तो और अपने UITableView अद्यतन के दौरान दिखाई नहीं देता है (उदाहरण: आप अपने UITableView में किसी अन्य दृश्य में डेटा जोड़ते हैं और UITableView उपयोगकर्ता इनपुट द्वारा बाद में प्रदर्शित होता है), बस UITableViewController की viewWillAppear विधि को ओवरराइड करें।

- (void)viewWillAppear:(BOOL)animated{ 
[super viewWillAppear:animated]; 
[self.tableView reloadData]; 
} 

सकारात्मक प्रभाव है कि आपके UITableView केवल एक बार यह डेटा पुन: लोड जब उपयोगकर्ता वास्तव में यह देखना चाहते हैं, जब नहीं नए आइटम जोड़ रहे हैं है।

2

मुझे आज भी इसी तरह का मुद्दा था (आईओएस 7.0 में स्टोरीबोर्ड)। मैं एक UIViewController के अंदर तालिका दृश्य का उपयोग कर रहा था। जब दृश्य लोड किया गया था सब ठीक काम कर रहा था; सभी प्रतिनिधियों को बुलाया जा रहा था।तथापि ; जब अंतर्निहित डेटा स्रोत (मेरे मामले में, ऐरे) संशोधित किया गया था; दिखाई देने वाली तालिका पंक्तियां अपडेट नहीं हो रही थीं। वे अपडेट किए गए थे; केवल जब मैं टेबल दृश्य स्क्रॉल कर रहा था।

सब कुछ करने का प्रयास किया; मुख्य थ्रेड पर रीलोड डेटा को कॉल करना; ViewWillAppear में पुनः लोड करना; कुछ भी काम नहीं किया।

जो मुद्दा मैंने पाया; क्या मैंने स्टोरीबोर्ड में कनेक्शन नहीं बनाया था; संदर्भ आउटलेट के साथ तालिका दृश्य के लिए। डेटा स्रोत और प्रतिनिधि सेट हालांकि थे। मुझे नहीं लगता था कि यह मुद्दा हो सकता है; क्योंकि सब कुछ पहली बार ठीक काम कर रहा था।

उम्मीद है कि यह किसी की मदद करेगी। मुझे यह पता लगाने के लिए कुछ भयानक समय था।

0

योनेल के समाधान में कुछ हद तक प्रतिलिपि बनाने और इसे अच्छा कहने के बाद मुझे एहसास हुआ कि performSelectorOnMainThread:withObject:waitUntilDone: पर कॉल करने से लक्षण ठीक हो गया है, लेकिन समस्या नहीं है। बड़ी समस्या यह है कि आप अभी भी एसिंक्रोनस या पृष्ठभूमि थ्रेड के संदर्भ में यूआई अपडेट कर रहे हैं।

dispatch_queue_t queue = dispatch_queue_create("com.kyleclegg.myqueue", NULL); 
dispatch_async(queue, ^{ 

    // Make API call 
    // Retrieve data, parse JSON, update local properties 
    // Make a call to reload table data 

}); 

जब यह इस तरह दिखना चाहिए:

dispatch_queue_t queue = dispatch_queue_create("com.kyleclegg.myqueue", NULL); 
dispatch_async(queue, ^{ 

    // Make API call 
    // Retrieve data, parse JSON, update local properties 

    dispatch_async(dispatch_get_main_queue(), ^{ 
    // Now make the call to reload data and make any other UI updates 
    [self.tableView reloadData] 
    }); 

}); 

केवल बात आपको बस इतना करना कॉल [self.tableView reloadData] है यह शायद करने के लिए ठीक है, तो

यह वही मेरी कोड की तरह दिखाई देता है performSelectorOnMainThread:withObject:waitUntilDone: का उपयोग करें क्योंकि यह एक ही लक्ष्य पूरा करता है, लेकिन आपको यह भी समझना चाहिए कि बड़ी तस्वीर में क्या हो रहा है। इसके अलावा यदि आप तालिका को फिर से लोड करने से अधिक यूआई काम कर रहे हैं तो उस कोड को मुख्य कतार पर भी जाना चाहिए।

संदर्भ: A concise example जीसीडी का उपयोग करने और पृष्ठभूमि बनाम मुख्य धागे का प्रबंधन करने के लिए।

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