दिलचस्प पोस्ट
स्रोत कोड पर वापस लाने के लिए एप बाइनरी को डिकंपल करें सी भाषा में एक फ़ाइल से एक लाइन हटाएं सभी व्यू नियंत्रकों के पास एक बटन बनाते रहना एंड्रॉइड क्या है: लेआउट_वेट का मतलब है? कॉमा और बिंदु के साथ दोगुनी करने के लिए स्ट्रिंग पार्स करें आर आंकड़ों में डमी वैरिएबल बनाना प्रोटोटाइप का उपयोग करने के लिए जावास्क्रिप्ट Google नक्शे को मार्क्स के साथ लाइट / एलएजी से एजेक्स की सफलता से डेटा वापस लाया गया निकटवर्ती समान तत्वों के बिना एक सूची के सभी क्रमबद्धता उत्पन्न करें ये जावास्क्रिप्ट bitwise ऑपरेटर्स क्या करते हैं? सिंक के बाहर आदेश; आप अब यह आदेश नहीं चला सकते मैं कमांड लाइन से आईओएस सिम्युलेटर को कैसे रीसेट कर सकता हूं? एंड्रॉइड एप्लिकेशन में 'अब' पर सेट डेट टाइम टाइम के साथ एक एसक्यूएलआईटी रिकॉर्ड कैसे सम्मिलित करें? कंस्ट्रक्टर में कॉन्स्ट फ़ील्ड को कैसे प्रारंभ करें? Django REST ढांचे में डेटाबेस प्रश्नों का अनुकूलन

जब dequeueReusableCellWithIdentifier बनाम dequeueReusableCellWithIdentifier का उपयोग करने के लिए: forIndexPath

DequeueReusableCellWithIdentifier के लिए दो अधिभार हैं और मैं यह निर्धारित करने की कोशिश कर रहा हूं कि मैं किसी दूसरे को कब उपयोग करूँ?

फॉर इंडेक्सपैथ फ़ंक्शन के बारे में सेब डॉक्स कहते हैं, "यह विधि तालिका दृश्य में सेल की स्थिति के आधार पर अतिरिक्त कॉन्फ़िगरेशन करने के लिए इंडेक्स पथ का उपयोग करती है।"

मुझे यकीन है कि कैसे हालांकि व्याख्या करने के लिए नहीं है?

वेब के समाधान से एकत्रित समाधान "जब dequeueReusableCellWithIdentifier बनाम dequeueReusableCellWithIdentifier का उपयोग करने के लिए: forIndexPath"

सबसे महत्वपूर्ण अंतर यह है कि forIndexPath: वर्जन (क्रैश करता है) यदि आपने पहचानकर्ता के लिए कोई क्लास या forIndexPath: पंजीकृत नहीं किया है पुराने (गैर- forIndexPath: संस्करण उस मामले में nil देता है।

आप रजिस्टर क्लास भेजकर किसी पहचानकर्ता के लिए एक वर्ग registerClass:forCellReuseIdentifier: तालिका दृश्य में आप एक पहचानकर्ता के लिए registerNib:forCellReuseIdentifier: तालिका व्यू को भेजकर registerNib:forCellReuseIdentifier: हैं।

यदि आप एक स्टोरीबोर्ड में अपना टेबल व्यू और अपने सेल प्रोटोटाइप बनाते हैं, स्टोरीबोर्ड लोडर आपको स्टोरीबोर्ड में परिभाषित सेल प्रोटोटाइप दर्ज करने का ध्यान रखता है।

सत्र 200 – डब्ल्यूडब्ल्यूडीसी 2012 से कोको टच में नया क्या है, इसके बारे में forIndexPath: लिए (तब-नया) forIndexPath: संस्करण 8 एम 30 के आसपास शुरू होता है। यह कहता है कि "आपको हमेशा एक आरंभिक सेल मिलेगा" (बिना यह उल्लेख किए कि अगर आप किसी क्लास या निबियर को पंजीकृत नहीं करते हैं तो क्रैश हो जाएगा)।

वीडियो यह भी कहता है कि "यह उस इंडेक्स पथ के लिए सही आकार होगा"। संभवत: इसका मतलब है कि यह सेल लौटने से पहले तालिका की अपनी चौड़ाई को देखकर और अपने प्रतिनिधि की मेज को कॉल कर tableView:heightForRowAtIndexPath: विधि (यदि परिभाषित किया गया है)। यही कारण है कि यह सूचकांक पथ की जरूरत है

dequeueReusableCellWithIdentifier:forIndexPath: हमेशा एक सेल वापस करेगा यह या तो मौजूदा कोशिकाओं का उपयोग करता है या फिर एक नया बनाता है और रिटर्न करता है यदि कोई कोशिका नहीं है।

हालांकि, परंपरागत dequeueReusableCellWithIdentifier: अगर वह मौजूद है, तो एक सेल लौटाएगा, यदि कोई सेल है जो इसका पुन: उपयोग किया जा सकता है तो वह वापस देता है और फिर वह शून्य देता है। तो आपको nil शर्त के लिए भी जांच करने के लिए एक शर्त लिखनी होगी

आपके प्रश्न का उपयोग करने के लिए dequeueReusableCellWithIdentifier: का जवाब देने के लिए dequeueReusableCellWithIdentifier: जब आप dequeueReusableCellWithIdentifier:forIndexPath बाद आईओएस 5 और निम्न संस्करणों का समर्थन करना चाहते हैं dequeueReusableCellWithIdentifier:forIndexPath केवल iOS 6+ पर उपलब्ध है

संदर्भ: https://developer.apple.com/library/ios/documentation/uikit/reference/UITableView_Class/Reference/Reference.html#//apple_ref/occ/instm/UITableView/dequeueReusableCellWithIdentifier:IndexPath के लिए :

मुझे कभी नहीं समझा गया है कि क्यों एप्पल ने नई विधि बनाई, dequeueReusableCellWithIdentifier: forIndexPath:। उनके दस्तावेज पूर्ण नहीं हैं, और कुछ भ्रामक हैं। मैं दो तरीकों के बीच में अंतर करने में सक्षम हूं, यह है कि पुरानी विधि शून्य हो सकती है, अगर उसमें पहचानकर्ता के साथ सेल नहीं मिलता है, जबकि नई विधि क्रैश हो जाती है, अगर वह वापस नहीं लौट सकती है एक कोशिका। यदि आप पहचानकर्ता को सही ढंग से सेट करते हैं, और एक स्टोरीबोर्ड में सेल बनाते हैं तो दोनों तरीकों से एक सेल वापस करने की गारंटी दी जाती है। दोनों विधियों को एक सेल या xib रजिस्टर करने के लिए, और कोड या एक xib फ़ाइल में अपना सेल बनाने के लिए एक सेल लौटने के लिए भी गारंटी दी जाती है।

यदि आप गतिशील जनरेटेड सामग्री का उपयोग कर रहे हैं तो मैं दोनों का उपयोग करने की सिफारिश करता हूं अन्यथा आपका ऐप अप्रत्याशित रूप से क्रैश हो सकता है आप एक वैकल्पिक पुन: प्रयोज्य सेल को पुनः प्राप्त करने के लिए अपना फ़ंक्शन कार्यान्वित कर सकते हैं। यदि यह nil तो आपको एक रिक्त सेल वापस करना चाहिए जो दिखाई नहीं दे रहा है:

स्विफ्ट 3

 // Extensions to UITableView extension UITableView { // returns nil, if identifier does not exist. // Otherwise it returns a configured cell for the given index path open func tryDequeueReusableCell ( withIdentifier identifier: String, for indexPath: IndexPath) -> UITableViewCell? { let cell = self.dequeueReusableCell(withIdentifier: identifier) if cell != nil { return self.dequeueReusableCell(withIdentifier: identifier, for: indexPath) } return nil } } 

और एक खाली सेल वापस करने के लिए एक्सटेंशन:

 // Extension to UITableViewCell extension UITableViewCell { // Generates an empty table cell that is not visible class func empty() -> UITableViewCell { let emptyCell = UITableViewCell(frame:CGRect(x:0, y:0, width:0, height:0)) emptyCell.backgroundColor = UIColor.clear return emptyCell } } 

इसका उपयोग करने का एक संपूर्ण उदाहरण:

 import Foundation import UIKit // A protocol is used to identify if we can configure // a cell with CellData protocol ConfigureAbleWithCellData { func configure(_ data: CellData) } class MyCustomTableViewCell : UITableViewCell, ConfigureAbleWithCellData { @IBOutlet weak var title:UILabel! = nil func configure(_ data: CellData) { self.title.text = data.title } } // This actually holds the data for one cell struct CellData { var title:String = "" var reusableId:String = "" } class CosmoConverterUnitTableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { // Storage var data = Array<Array<CellData>>() func loadData() { var section1:[CellData] = [] var section2:[CellData] = [] section1.append(CellData(title:"Foo", reusableId:"cellType1")) section2.append(CellData(title:"Bar", reusableId:"cellType2")) data.append(section1) data.append(section2) } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return data[section].count } public func numberOfSections(in tableView: UITableView) -> Int { return data.count } func tableView( _ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard indexPath.row < data[indexPath.section].count else { fatalError("this can't be") } let cellData = data[indexPath.section][indexPath.row] if let cell = tableView.tryDequeueReusableCell( withIdentifier: cellData.reusableId, for: indexPath) { if let configurableCell = cell as? ConfigureAbleWithCellData { configurableCell.configure(cellData) } else { // cell is not of type ConfigureAbleWithCellData // so we cant configure it. } return cell } // id does not exist return UITableViewCell.empty() } } 

छोटे के लिए:

dequeueReusableCell(withIdentifier, for) केवल प्रोटोटाइप कोशिकाओं के साथ काम करता है यदि आप इसका उपयोग करने का प्रयास करते हैं, तो प्रोटोटाइप सेल अनुपस्थित होता है, तो यह एप्लिकेशन को क्रैश कर देगा।

होल्लेमस एम। 2016, अध्याय 2 चेकलिस्ट, आईओएस अपरेंटिस (5वी संस्करण) पीपी: 156