যখন DequeueReusableCelllWithIdentifier বনাম dequeueReusableCelllithithdifier ব্যবহার করতে হবে: forIndexPath


167

DequeueRususableCelllWithIdentifier এর জন্য দুটি ওভারলোড রয়েছে এবং আমি নির্ধারণ করার চেষ্টা করছি যে কখন আমি একটির তুলনায় অন্যটি ব্যবহার করব?

ForIndexPath ফাংশন সম্পর্কিত আপেল ডকস সূচিত করে, "এই পদ্ধতিটি টেবিল ভিউতে ঘরের অবস্থানের উপর ভিত্তি করে অতিরিক্ত কনফিগারেশন সম্পাদনের জন্য সূচী পথ ব্যবহার করে" "

আমি নিশ্চিত যে কিভাবে এটি ব্যাখ্যা করবেন?

উত্তর:


216

সর্বাধিক গুরুত্বপূর্ণ পার্থক্য হ'ল forIndexPath:যদি আপনি সনাক্তকারীটির জন্য কোনও শ্রেণি বা নিব নথিভুক্ত না করেন তবে সংস্করণটি দৃser়ভাবে জানায় (ক্র্যাশ করে)। পুরানো (অ- forIndexPath:) সংস্করণ সেক্ষেত্রে ফিরে আসে nil

আপনি registerClass:forCellReuseIdentifier:টেবিল ভিউতে প্রেরণ করে শনাক্তকারীর জন্য একটি শ্রেণি নিবন্ধ করুন । আপনি registerNib:forCellReuseIdentifier:টেবিল ভিউতে প্রেরণ করে সনাক্তকারী হিসাবে নিব নিবন্ধন করুন ।

আপনি যদি কোনও স্টোরিবোর্ডে আপনার টেবিল ভিউ এবং আপনার সেল প্রোটোটাইপগুলি তৈরি করেন, স্টোরিবোর্ড লোডার স্টোরিবোর্ডে আপনার নির্ধারিত সেল প্রোটোটাইপগুলি নিবন্ধকরণের যত্ন নেন।

সেশন 200 -forIndexPath: ডাব্লুডাব্লুডিসি 2012 থেকে কোকো টাচে নতুন কি আছে 8 এম 30 এর দশকে শুরু হওয়া (তত্কালীন) সংস্করণটি নিয়ে আলোচনা করা হয়েছে । এটি বলে যে "আপনি সর্বদা একটি প্রাথমিক কোষ পাবেন" (আপনি ক্লাস বা নিব না নিলে এটি ক্রাশ হবে উল্লেখ করে) will

ভিডিওটি আরও বলেছে যে "এটি সেই সূচকের পথের জন্য সঠিক আকার হবে"। সম্ভবত এটির অর্থ হ'ল এটি টেবিল দৃশ্যের নিজস্ব প্রস্থটি দেখে এবং আপনার প্রতিনিধিটির tableView:heightForRowAtIndexPath:পদ্ধতিটি (যদি সংজ্ঞায়িত করা হয়) কল করে এটি ফেরত দেওয়ার আগে ঘরের আকারটি সেট করে । এজন্য এটি সূচকের পথ প্রয়োজন।


সত্যিই এটি সহায়ক, ধন্যবাদ। সেলটি শালীন সময়ে মাপ দেওয়ার পরে অটো মাপ দেওয়ার এবং বিন্যাস সীমাবদ্ধতার সাথে কোনও সুবিধা কম মনে হয়?
বেঞ্জহান

38

dequeueReusableCellWithIdentifier:forIndexPath:হবে সবসময় একটি সেল ফিরে যান। এটি হয় বিদ্যমান কক্ষগুলি পুনরায় ব্যবহার করে বা একটি নতুন তৈরি করে এবং কোষ না থাকলে ফিরে আসে।

যদিও, traditional dequeueReusableCellWithIdentifier:তিহ্যবাহী একটি সেল উপস্থিত থাকলে তা পুনরায় ফিরিয়ে দেবে অর্থাত্ যদি এমন কোনও ঘর থাকে যা পুনরায় ব্যবহার করা যায় তবে এটি আবার ফিরে আসে else সুতরাং nilমানটি পরীক্ষা করার জন্য আপনাকে একটি শর্তও লিখতে হবে ।

আপনি dequeueReusableCellWithIdentifier:যখন আইওএস 5 এবং নিম্ন সংস্করণগুলি সমর্থন করতে চান তখন আপনার প্রশ্নের ব্যবহারের উত্তর দেওয়ার dequeueReusableCellWithIdentifier:forIndexPathজন্য কেবল আইওএস 6+ এ উপলব্ধ

তথ্যসূত্র: https://developer.apple.com/library/ios/docamentation/uikit/references/UITableView_Class/References/References.html#//apple_ref/occ/instm/UITableView/dequeueReusableCellWithIdentifier:forIndexPath :


না, এটি সর্বদা একটি সেল ফেরত দেয় না 2014-12-26 07: 56: 39.947 টেস্টপ্রোগ [4024: 42920390] *** এতে দৃ failure়তা ব্যর্থতা - [ইউআইটিএলভিউ ডিউকিউরউইজেবলসেলভিথআইডেন্টিফায়ার: ফর ইন্ডেক্সপথ:], / সোর্সক্যাচি / ইউআইকিট_সেম / ইউআইকিট_৩১18..6/5 UITableView.m: 6116 2014-12-26 07: 56: 39.954 ইন্টারফেজ [4024: 42920390] *** অপ্রয়োজনীয় ব্যতিক্রম 'NSInternInconsistencyException' এর কারণে অ্যাপ্লিকেশনটি সমাপ্ত করা হচ্ছে, কারণ: 'MyCustomCellIdentifier- এর সাথে একটি কক্ষ সনাক্ত করতে অক্ষম - একটি নিবন্ধটি নিবন্ধন করতে হবে বা শনাক্তকারীর জন্য একটি ক্লাস বা স্টোরিবোর্ডে একটি প্রোটোটাইপ সেল সংযুক্ত করুন '
স্পষ্টলাইট

@ বাইনারিস্টার লোড লোড করার জন্য আপনাকে অবশ্যই আপনার কাস্টম সেলটির একটি নিব বা শ্রেণি রেজিস্টার করতে হবে । লাইক:[self.tableView registerNib:[UINib nibWithNibName:@"cell" bundle:nil] forCellReuseIdentifier:@"cell"];
গুডএসপিএনডি 3

6

অ্যাপল কেন নতুন পদ্ধতি তৈরি করলো তা আমি কখনই বুঝতে পারি নি, ডিউকিউ রিজেজেবলসেল উইথআইডেন্টিফায়ার: ইনডেক্সপথ:। তাদের উপর তাদের ডকুমেন্টেশন সম্পূর্ণ নয়, এবং কিছুটা বিভ্রান্তিকর। দুটি পদ্ধতির মধ্যে আমি যে পার্থক্যটি বুঝতে পেরেছি তা হ'ল এটি হল যে পুরানো পদ্ধতিটি শূন্য করতে পারে, যদি এটি সনাক্তকারীটির সাথে পাস করা কোনও সেল খুঁজে না পায়, যখন নতুন পদ্ধতিটি ক্র্যাশ করে, যদি এটি ফিরে না আসতে পারে একটি মুঠোফোন. উভয় পদ্ধতিই কোনও ঘরে ফেরত দেওয়ার গ্যারান্টিযুক্ত, যদি আপনি সনাক্তকারীকে সঠিকভাবে সেট করে রেখেছেন এবং একটি স্টোরবোর্ডে ঘর তৈরি করেন। উভয় পদ্ধতিতে আপনি কোনও শ্রেণি বা xib নিবন্ধন করে, এবং কোডটি বা একটি xib ফাইলে আপনার ঘর তৈরি করলে একটি ঘর ফেরত দেওয়ার গ্যারান্টিযুক্ত।


3
নতুন পদ্ধতিটি ঘরের সঠিক আকার নির্ধারণের জন্য সূচী পথ ব্যবহার করে।
রব মায়ফ

1
@robmayoff তবে এর কি কোনও ধারণা আছে? নতুন পদ্ধতি ছাড়াই ঘরের আকারটি এখনও সঠিকভাবে সেট করা যায়। নতুন পদ্ধতিটি কোনও সুবিধা দিতে পারে?
ফুজিয়ানজিন 6471

1
বিস্তারিত জানার জন্য আমার উত্তরের শেষ অনুচ্ছেদটি পড়ুন।
রব মায়ফ

সুতরাং এর অর্থ কি, যদি আমার সমস্ত ঘরগুলি টেবিলের মধ্যে একই আকারের হয়, তবে আমি কোন পদ্ধতিটি কল করি তাতে কিছু যায় আসে না?
হ্যাপিহিয়াপ্পি

2
যদি আমি সরবরাহ করি tableView.estimateHeightতবে কক্ষের আকারটি সঠিকভাবে নির্ধারণ করা হবে। আমি এখনও নতুন পদ্ধতির সুবিধা পাই না।
রায়ান

1

অল্পের জন্য:

dequeueReusableCell(withIdentifier, for)কেবল প্রোটোটাইপ কোষগুলির সাথে কাজ করে। প্রোটোটাইপ সেলটি অনুপস্থিত থাকাকালীন আপনি যদি এটি ব্যবহার করার চেষ্টা করে থাকেন তবে এটি অ্যাপটিকে ক্র্যাশ করবে।

হোলম্যানস এম 2016, অধ্যায় 2 চেকলিস্ট, আইওএস শিক্ষানবিশ (5 তম সংস্করণ)। পিপি: 156।


-2

আপনি যদি গতিশীল উত্পন্ন সামগ্রী ব্যবহার করেন তবে আমি উভয়ই ব্যবহার করার পরামর্শ দেব। অন্যথায় আপনার অ্যাপ্লিকেশনটি অপ্রত্যাশিতভাবে ক্র্যাশ হতে পারে। Anচ্ছিক পুনরায় ব্যবহারযোগ্য ঘরটি পুনরুদ্ধার করতে আপনি নিজের ফাংশনটি প্রয়োগ করতে পারেন। যদি এটি হয় তবে 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()
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.