ios - এর ডেটা সোর্স থেকে একটি ঘর পেতে ব্যর্থ




objective-c uitableview (11)

সুইফট 3.0

আপনাকে কেবল ইউআইটিএবলভিউডেলিগেট এবং ইউআইটিএবলভিউডাটা সোর্স যুক্ত করতে হবে

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

নীচের চিত্রটি কেবল আপনার রেফারেন্সের জন্য।

নীচের কোডটি দিয়ে কী ভুল হচ্ছে

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    NSString *CellIdentifier  = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    cell.textLabel.text = @"hello";

    return cell;
}

এবং

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return 2;
}

তবে আমি এর ডেটা সোর্স থেকে একটি সেল পেতে ব্যর্থ হচ্ছি

সম্পূর্ণ ব্যতিক্রম হয়

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView (<UITableView: 0x7ffe0b092800; frame = (0 97; 414 590); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7ffe0acf3b10>; layer = <CALayer: 0x7ffe0aceb6e0>; contentOffset: {0, 0}; contentSize: {414, 88}>) failed to obtain a cell from its dataSource (<AllContactsViewController: 0x7ffe0ace60f0>)'

আমি টেবিল দৃশ্যের জন্য প্রতিনিধি এবং ডেটা উত্স সেট করেছি


অন্যান্য পোস্টগুলিতে প্রস্তাবিত পদক্ষেপগুলি সম্পন্ন করার পরে এবং আমার সেলটি শূন্য ছিল কিনা তা যাচাই করার পরে, এটি আমার সমস্যার সমাধান হয়নি এবং আমি যখন পরীক্ষা করেছি তখন আমার সেল শূন্য হয়ে দেখায় না। যাইহোক, এই হ্যান্ডি কোড স্নিপেট সেখানে যুক্ত করার ফলে সমস্যাটি সমাধান হয়েছে, সুতরাং এটি অবশ্যই এমন কোনও স্থানে নিখুঁত হয়েছে যেখানে আমি এটি ধরছিলাম না।

if (cell == nil)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ClassNameOfMyCustomCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];
}

আপনাকে ঘরে একটি শনাক্তকারী দিতে হবে। "সেল" শনাক্তকরণ ক্ষেত্রের ঘরের বৈশিষ্ট্য পরিদর্শকের মতোই সনাক্তকারীকে সেল দেয়। আমি আপনার ত্রুটিটি পুনরায় উত্পাদিত করেছি এবং এটি কারণ আপনি নিজের ঘরে কোনও পরিচয়দানকারীকে দেন নি।


আপনার ত্রুটিটি পরামর্শ দেয় যে cellForRowAtIndexPath কোনও কারণে nil ফিরে আসছে এবং আমি অনুমান করছি কারণ আপনি পুনরায় ব্যবহারযোগ্য ঘরটি সন্ধান করতে ব্যর্থ হচ্ছেন। আপনি যদি এটি নিশ্চিত করতে চান তবে আপনার বর্তমান ডিকিউ কলের পরে একটি ব্রেকপয়েন্ট নির্ধারণ করুন: আমি আশা করি আপনি cell nil সেট করেছেন।

আপনি যদি আধুনিক এক্সকোড টেম্পলেট ব্যবহার করেন যেখানে আপনি নিজের জন্য তৈরি একটি প্রোটোটাইপ সেল পেয়ে থাকেন, আপনি সম্ভবত পরিবর্তে এটি ব্যবহার করা উচিত:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

আপনি যদি কোনও এক্সকোড টেম্পলেট ব্যবহার না করে থাকেন তবে যে কোনও উপায়ে কোডের লাইনটি ব্যবহার করুন তারপরে নিজের মতো করে পুনরায় ব্যবহার শনাক্তকারীটিকে রেজিস্টার করুন:

[self.tableView registerClass:[UITableViewCell self] forCellReuseIdentifier:@"Cell"];

সমস্যাটি সমাধান করা উচিত সবই ভাল। আমি এটি সুইফ্ট ব্যবহারকারীদের জন্য আরও বিশদে লিখেছি।


আমার একই সমস্যা ছিল এবং এটি হ'ল কারণ আমি ইউআইটিএবলভিডাটা ডেটা সোর্স এবং ইউআইটিএবলভিউডেলিগেট প্রোটোকলগুলি প্রয়োগ করতে ভুলে গেছি

উত্তরাধিকার সূত্রে প্রাপ্ত শ্রেণীর পরে তাদের কেবল আপনার শ্রেণির ঘোষণায় যুক্ত করুন

এক্সকোডকে অবশ্যই আমাকে সে সম্পর্কে সতর্ক করতে হবে, কারণ আমি আমার কোডে ইউআইটিএবলভিডাটা ডেটা সোর্স এবং ইউআইটিএবলভিউডেলিগেট পদ্ধতি ব্যবহার করেছি


আমার ক্ষেত্রে, আমি ইউআইটিএলভিউ ডেটাসোর্স, ইউআইটিএলভিউর জন্য ইউআইটিএলভিউডেলিগেট ঘোষণা করতে ভুলে গিয়েছিলাম।


ইউআইটিএবল ভিউ ডেটা সোর্স যুক্ত হয়েছে কিনা তা পরীক্ষা করুন। আমি এটি মিস করেছি, সুতরাং অ্যাপটি ক্র্যাশ হয়ে গেছে


ইউআইটিএবলভিউ বাদে টেবিলভিউসেল ব্যবহার করার সময় আপনাকে নিজেই এনআইবি নিবন্ধন করতে হবে। যখন এনআইবি নিবন্ধিত না হয় "তার ডেটা উত্স থেকে কোনও সেল পেতে ব্যর্থ হয়েছে" ত্রুটি দেখা দিতে পারে। ত্রুটি বর্ণনা থেকে আমি সবসময় খুঁজে বের করা কঠিন, কি ভুল তা খুঁজে পাওয়া যায় না।

এই ত্রুটিটি নিবন্ধকরণের মাধ্যমে সহজেই সমাধান করা যেতে পারে:

 [self registerNib:[customerButtonTableViewCell class]
     forCellReuseIdentifier:customerButtonCellIdentifier forTableView:tableView];

নিশ্চিত হয়ে নিন যে আপনি ইউআইটিএবল ভিউডেলিগেট এবং ইউআইটিএবলভিডাটা ডেটা সোর্স প্রোটোকলগুলি প্রয়োগ করতে ভোলেন নি।

class ExampleViewController: UIViewController, UITableViewDelegate, UITableViewDataSource


প্রোটোটাইপ সেলের জন্য আপনি মূল স্টোরি বোর্ডে প্রদত্ত একই পরিচয়দাতা সম্ভবত ব্যবহার করছেন না। আপনি সঠিক শনাক্তকারী ব্যবহার করছেন তা নিশ্চিত করার জন্য আপার কেস লোয়ার কেসের জন্য নাম বলার চেষ্টা করুন।

শুভকামনা :)


স্থানান্তরিত হওয়ার সময় সাবধানতা অবলম্বন করুন
যদি কেউ তাদের কোডটি পুরনো UITableViewDataSource সংস্করণগুলি থেকে নতুনগুলিতে স্থানান্তরিত করে, তবে আপনি যদি অনিচ্ছাকৃতভাবে UITableViewDataSource ফাংশনগুলির সিনট্যাক্সটিকে নতুন সুইফট সিনট্যাক্সে পরিবর্তন না করেন তবে এটি ঘটতে পারে।
দুর্ভাগ্যক্রমে সংকলক এটি সম্পর্কে অভিযোগ করবে না।
আমি যখন আমার কোডটি সুইফট 2 থেকে সুইফট 4-এ সরিয়ে নিয়েছি তখন আমি এর মুখোমুখি হয়েছিলাম আমি সেলফোরআর ডেটাসোর্স পদ্ধতির বাক্য গঠনটি এখান থেকে পরিবর্তন করি নি:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell   

তার দ্রুত 4 সংস্করণে:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell  

এবং আমি ত্রুটি পেয়েছি:

"Failed to obtain a cell from its DataSource"




uitableview