2012-01-23 20 views
7

Ahoy के समान एक पुन: प्रयोज्य UIView बनाना!UITableViewCell

मैं UITableViewController में उपयोग किए गए UITableViewCell कार्यान्वयन के समान एक पुन: प्रयोज्य UIView (विभिन्न कारणों से) बनाने की कोशिश कर रहा हूं। मैं UIScrollView में पुन: प्रयोज्य दृश्य का उपयोग करना चाहता हूं, इसलिए मुझे पता है कि मैं कुछ हासिल करने की कोशिश नहीं कर रहा हूं जो पूरी तरह से अटूट है।

इस के डिफ़ॉल्ट दिया गया है:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //declare cell identifier 
    static NSString *cellIdentifier = @"cell_identifier"; 

    //dequeue cell 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    //check cell is valid 
    if(cell == nil) 
    { 
     //create a new cell 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier]; 
    } 

    // 

    //return cell 
    return cell; 
} 

इस से, यह ध्यान देने योग्य है कि सेल UITableView से dequeued है लायक है। यदि सेल अमान्य है, तो एक नया सेल बनाया गया है। मेरा सवाल यह है कि, फिर यह कोशिका फिर से पुन: उपयोग के लिए "कतारबद्ध" कैसे बनती है?

मेरे वर्तमान का प्रयास कार्यान्वयन इस तरह दिखता है:

- (TestScrollViewCell *)scrollView:(TestScrollView *)_scrollView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //declare cell identifier 
    static NSString *cellIdentifier = @"cell_identifier"; 

    //dequeue cell 
    TestScrollViewCell *cell = (TestScrollViewCell *)[scrollView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    //check cell is valid 
    if(cell == nil) 
    { 
     //create a new cell 
     cell = [[TestScrollViewCell alloc] initWithFrame:CGRectZero]; 
    } 

    // 

    //return cell 
    return cell; 
} 

मुझे लगता है कि मेरी TestScrollView करने के लिए एक NSMutableDictionary जोड़ने cellIdentifier और TestScrollViewCell (UIView) स्टोर करने के लिए सोच रहा हूँ और फिर उन्हें शब्दकोश के आधार पर तोड़ वापस बाहर कुंजी एक अच्छी शुरुआत होगी लेकिन क्या यह वास्तव में "पुन: प्रयोज्य" कोशिकाओं का एक वास्तविक कार्यान्वयन है?

जो मुद्दा मैं देख सकता हूं वह यह है कि मैं तब स्क्रॉलव्यू में UIView जोड़ रहा हूं जो फ्रेम के आधार पर स्थित है। इस अर्थ में एक दृश्य को अस्वीकार करने से मुझे पहले दृश्य को प्रभावित किए बिना स्क्रॉल व्यू में दृश्य जोड़ने की अनुमति नहीं दी जाएगी (फ्रेम को संशोधित करके) लेकिन निश्चित रूप से यह है कि UITableViewCells कैसे काम करता है, साथ ही अनुभाग शीर्षलेख/पाद लेख भी?

मैं this implementation पर देख रहा हूं जो कि उसी मार्ग का पालन कर रहा है जो मैं लागू करने का इरादा रख रहा था लेकिन मुझे 100% बेचा नहीं गया है कि यह पुन: प्रयोज्य कोशिकाओं का सही कार्यान्वयन है।

क्या किसी के पास इससे पहले कोई भाग्य है? मैं इस पर ऐप्पल का नेतृत्व करने की कोशिश कर रहा हूं लेकिन यूआईटीबल व्यूसेल और एमकेएनोटेशन व्यू (मैपकिट) के अलावा, मेरे लिए इससे कोई सुलभ कार्यान्वयन नहीं है।

किसी भी मदद की सराहना की जाएगी।

उत्तर

3

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