2010-01-28 13 views
50

आधिकारिक दस्तावेज से:आईफोन - पुन: उपयोग करने वाले क्या हैं (UITableViewCell)?

पुन: उपयोग पहचानकर्ता एक तालिका दृश्य की अनेक पंक्तियों के लिए एक UITableViewCell उद्देश्य यह है कि मेज पर-व्यू के प्रतिनिधि आशय (प्रदर्शन कारणों से) के आधार के रूप में यह पुन: उपयोग करने के साथ बनाता है साथ जुड़ा हुआ है । यह initWithFrame में सेल ऑब्जेक्ट को असाइन किया गया है: पुन: उपयोग करें: और उसके बाद बदला नहीं जा सकता है। एक UITableView ऑब्जेक्ट वर्तमान में पुन: प्रयोज्य कोशिकाओं की एक कतार (या सूची) रखता है, प्रत्येक का अपना पुन: उपयोग पहचानकर्ता होता है, और उन्हें डेक्यू रिसाइबलसेलविथ इंडेंटिफायर: प्रतिनिधि में प्रतिनिधि को उपलब्ध कराता है।

http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableViewCell_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableViewCell/reuseIdentifier

मुझे यह समझ में नहीं आता। खैर, मैं मूल विचार को समझता हूं, मुझे लगता है कि आप UITableViewCells बनाते हैं, और नए (या ऐसा कुछ) बनाने के बजाय जितना भी आप कर सकते हैं उसका पुन: उपयोग करने का प्रयास करते हैं। लेकिन क्या वास्तव में फैसला करता है कि सेल पुन: प्रयोज्य है या नहीं? अगर मेरे पास दो समान (दृष्टि से) कोशिकाएं हैं, लेकिन विभिन्न ग्रंथों के साथ (मुझे लगता है कि वे पूरी तरह से समान नहीं हैं), क्या वे दोनों एक ही पहचानकर्ता हो सकते हैं? या उनके पास अलग-अलग होना चाहिए? या आप किस स्थिति में विभिन्न पहचानकर्ताओं का उपयोग करना चाहते हैं?

कोई भी उस स्थान को स्पष्ट या लिंक कर सकता है जहां यह है?

dequeueReusableCellWithIdentifier का उपयोग tableView के लिए, आप बहुत चीज़ों को गति कर सकते हैं:

उत्तर

65

ठीक है, यह मैं कैसे विश्वास है कि यह काम करता है। बहुत से कोशिकाओं को तुरंत चालू करने के बजाय, आप बस जितनी आवश्यक हो, तुरंत शुरू करें, यानी जो दिखाई दे रहे हैं (यह स्वचालित रूप से संभाला जाता है)। यदि सूची में किसी क्षेत्र में स्क्रॉल करना है जहां "सेल्स" हैं जिन्हें अभी तक उनके दृश्य प्रस्तुत नहीं हुए हैं, तो नए लोगों को तुरंत चालू करने के बजाय, आप पहले से ही मौजूदा लोगों का पुन: उपयोग करते हैं।

आप स्वयं इस ऐसा करके की कोशिश कर सकते हैं:

static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) 
{ 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    NSLog(@"new one"); 
} 
else 
{ 
    NSLog(@"old one"); 
} 

याद रखें, आप केवल dequeueReusableCellWithIdentifier एक सेल वापस जाने के लिए अगर यह लागू होता है चाहता हूँ। तो यदि एक सेल का पुन: उपयोग किया जा रहा है, तो सुनिश्चित करें कि यह स्थिति के लिए सही है। यही पुन: उपयोग है INTIFIFERS के लिए हैं। आमतौर पर, आपको केवल एक की आवश्यकता होगी। लेकिन ऐसी एक सूची हो सकती है जो कई अलग-अलग प्रकार की कोशिकाओं का उपयोग करती है, और उस स्थिति में, आपको अलग-अलग पुन: उपयोग करने वाले इंडेंटिफायर प्रदान करके उन्हें अलग रखना होगा। अन्यथा आप एक सेल प्राप्त कर सकते हैं जिसे आप किसी अन्य प्रकार के सेल के रूप में देखते हैं (उदाहरण के लिए, आप जिस कस्टम व्यक्ति को चाहते थे उसके बजाय UITableView सेल)।

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

यह डिज़ाइन पैटर्न object pooling के रूप में जाना जाता है।

+14

मैं है एक लंबे समय और ठोकरें खाते हुए चल के लिए iPhone से विकसित किया गया यह वीडियो पसंद पुनरावृत्ति की तरह है इस जवाब पर इस विषय को बहुत स्पष्ट किया गया। –

+0

अच्छा स्पष्टीकरण :) – Karun

+0

ऑब्जेक्ट पूलिंग सही शब्द उस – Shajo

10

बस कुछ चीजें जोड़ने के लिए quano अन्यथा बहुत अच्छा जवाब है: (मैं एक टिप्पणी के रूप में इस जोड़ने की कोशिश की है, लेकिन यह बहुत लंबा था!) ​​

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

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

इसलिए, इस मामले में, यह प्रत्येक सेल को शून्य पहचानकर्ता के साथ शुरू करने के लिए कोड रखरखाव के मामले में बेहतर है (क्योंकि इसे किसी भी तरह से पुन: उपयोग नहीं किया जा रहा है) और प्रत्येक सेल की जानकारी को उचित रूप से पुन: उपयोग करने के बारे में चिंता किए बिना भरें।

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