DequeueRususableCelllWithIdentifier: জন্য ইনডেক্সপথ:


324

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

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = 
     [tableView dequeueReusableCellWithIdentifier:CellIdentifier 
                                     forIndexPath:indexPath];
    if (cell == nil) {

        cell = 
         [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle  
                                reuseIdentifier:CellIdentifier];

    }

আউটপুটটিতে এখানে ত্রুটি রয়েছে:

2012-10-04 20: 13: 05.356 পাঠক [4390: c07] * এতে দৃ failure়তা ব্যর্থতা - [ইউআইটিএলভিউ ডিউকিউরউইজেবলসেল উইথআইডেন্টিফায়ার: ফর ইনডেক্সপথ:], / সোর্সচ্যাচ / ইউআইকিট_সিম / ইউআইকিট-2372/UITableView.m:4460 2012-1044 13: 05.357 পাঠক [4390: c07] * অপ্রয়োজনীয় ব্যতিক্রম 'NSInternInconsistencyException' কারণে অ্যাপ্লিকেশন সমাপ্তি, কারণ: 'সনাক্তকারী সেলের সাথে একটি সেল সনাক্ত করতে অক্ষম - সনাক্তকারীটির জন্য একটি নিব বা একটি শ্রেণীর নিবন্ধন করতে হবে বা স্টোরিবোর্ডে একটি প্রোটোটাইপ সেল সংযুক্ত করতে হবে ' * প্রথমে নিক্ষেপ কল স্ট্যাক: (0x1c91012 0x10cee7e 0x1c90e78 0xb64f35 0xc7d14 0x39ff 0xd0f4b 0xd101f 0xb980b 0xca19b 0x6692d 0x10e26b0 0x228dfc0 0x228233c 0x228deaf 0x1058cd 0x4e1a6 0x4ccbf 0x4cbd9 0x4be34 0x4bc6e 0x4ca29 0x4f922 0xf9fec 0x46bc4 0x47311 0x2cf3 0x137b7 0x13da7 0x14fab 0x26315 0x2724b 0x18cf8 0x1becdf9 0x1becad0 0x1c06bf5 0x1c06962 0x1c37bb6 0x1c36f44 0x1c36e1b 0x147da 0x1665c 0x2a02 0x2935 ) libc ++ abi.dylib: সমাপ্তি বলা একটি ব্যতিক্রম নিক্ষেপ

এবং কোডটি এখানে এটি ত্রুটির স্ক্রিনে দেখায়:

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

সাহায্য করুন!


উত্তর:


488

আপনি dequeueReusableCellWithIdentifier:forIndexPath:পদ্ধতিটি ব্যবহার করছেন । এই পদ্ধতির জন্য ডকুমেন্টেশন এটি বলে:

গুরুত্বপূর্ণ: ব্যবহার করে আপনি একটি বর্গ বা নিব ফাইল রেজিস্টার করতে হবে registerNib:forCellReuseIdentifier:বা registerClass:forCellReuseIdentifier:এই পদ্ধতি কল করার আগে পদ্ধতি।

আপনি পুনরায় ব্যবহারকারীর শনাক্তকারীর জন্য কোনও নিব বা ক্লাস নিবন্ধন করেন নি "Cell"

আপনার কোডটির দিকে তাকিয়ে, আপনি মনে করছেন যে কোনও প্রকারের nilসেল দেওয়ার জন্য যদি এটির কোনও সেল না থাকে তবে প্রসূতি পদ্ধতিটি ফিরে আসবে expect আপনাকে dequeueReusableCellWithIdentifier:সেই আচরণের জন্য ব্যবহার করতে হবে :

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

লক্ষ্য করুন dequeueReusableCellWithIdentifier:এবং dequeueReusableCellWithIdentifier:forIndexPath:বিভিন্ন পদ্ধতি। প্রাক্তন এবং পরবর্তীকালের জন্য ডক দেখুন ।

আপনি বুঝতে কেন আপনি কি কখনো ব্যবহার করতে চান সেটি চান dequeueReusableCellWithIdentifier:forIndexPath:, এই Q & A- খুঁজে বার করো


166
ঈশ্বর. কোনও ইউআইটিএবলভিউ কনট্রোলারের জন্য এক্সকোডের ডিফল্ট টেম্পলেটটি কেন আপনাকে স্বয়ংক্রিয়ভাবে আপনাকে ডেকিউরউইজেবলসেলউইথআইডিটিফায়ার দেয়: ফরেক্স ইন্ডেক্সপথ:? তাই অসহায়।
স্প্যান্টলে

15
dequeueReusableCellWithIdentifer:forIndexPath:যেহেতু আপনি যদি সেল শূন্য কিনা চেক করার প্রয়োজন হবে না (iOS6 চালু), একটি চমৎকার উন্নতি হয়। (সুতরাং এর সাথে UITableViewControllerএকইভাবে কাজ করে UICollectionView) তবে হ্যাঁ, বিরক্তিজনক যে এই পরিবর্তনটি টেমপ্লেটে কোনও মন্তব্য নয় এবং দৃ /়তা / ক্র্যাশ বার্তা আরও সহায়ক নয়।
জেসন মুর

2
খুব কমপক্ষে আপনি ভাবেন যে এটি ইমপ্লোডিংয়ের পরিবর্তে ইউআইটিএবলভিউসেলকে ডিফল্ট করবে। বাকা।
ব্যাডপ্রেট

13
এই উত্তরের শেষ লাইনটি সোনালী: dequeueReusableCellWithIdentifier:forIndexPath:যখন ব্যবহার করা উচিত তখন ব্যবহার করে আমাকে একাধিকবার কামড় dequeueReusableCellWithIdentifier:
ইলে

এই উত্তর নিখুঁত। আমার একটি প্রশ্ন রয়েছে: আমার প্রাথমিক ভিউ কন্ট্রোলার হিসাবে আমার একটি টেবিলভিউ কনট্রোলার রয়েছে। ডেডিলিটরোতে ... আমি নেভিগেশন স্ট্যাকের উপরে অন্য টেবিলভিউ কনট্রোলারকে চাপ দিচ্ছি আমি কীভাবে কেবল দ্বিতীয় টেবিলভিউ কনট্রোলারের জন্য প্রাথমিক নয়, কেবলমাত্র একটি ঘর নিবন্ধন করতে পারি?
ArielSD

137

আমি মনে করি এই ত্রুটিটি সনাক্তকারী হিসাবে আপনার নিব বা ক্লাস নিবন্ধকরণ সম্পর্কে।

যাতে আপনি আপনার টেবিলভিউতে যা করছেন তা রাখতে পারেন: সেলফরআরআউটআইডেক্সপথ ফাংশন এবং কেবলমাত্র আপনার ভিডডিডোডের নীচে কোড যুক্ত করুন:

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

এটা আমার জন্য কাজ। আশা করি এটি সাহায্য করতে পারে।


3
এটির সাথে একটি ছোট্ট গোচা - নিশ্চিত হয়ে নিন যে পুনরায় ব্যবহারকারীর শনাক্তকারী কক্ষের জন্য আপনার স্টোরিবোর্ড সেটিংসে যা সেট আপ করেছেন তা মিলে যায়।
জেমস বাউচার

কিছুটা আলাদা ব্যবহারের ক্ষেত্রে এটি যুক্ত করার জন্য, আমি আমার স্প্লিটভিউ কনট্রোলারের মাস্টার ভিউতে একটি সারি পুনর্নির্মাণ করছি। এই পুনরায় নির্বাচন সারির যুক্তিটি ছিল viewDidLoadএবং এই যুক্তিটিকে viewDidAppearএটি স্থির করতে সরানো moving
ক্রেগ কনভার্স

এটি সেল == শূন্য প্রবেশ করতে পারে না, তাই আমার টেবিলভিউ সেলটি সর্বদা শুন্য থাকে।
সলিড নরম

3
সুইফট ৩.০: সেল্ফ.ট্যাবলভিউ.রেজিস্টার (ইউআইটিএবলভিউসেলসি.এল.ক্লোরফোর্ডকোডার (), সেলসরেউসআইডিটিফায়ার: "সেল");
norbDEV

68

যদিও এই প্রশ্নটি মোটামুটি পুরানো, তবে আরও একটি সম্ভাবনা রয়েছে: আপনি স্টোরিবোর্ডগুলি ব্যবহার করছেন, আপনাকে কেবল স্টোরিবোর্ডে সেলআইডেন্টিফায়ার সেট করতে হবে।

সুতরাং যদি আপনার সেলআইডিটিফায়ারটি "সেল" হয় তবে কেবল "সনাক্তকারী" বৈশিষ্ট্যটি সেট করুন: এখানে চিত্র বর্ণনা লিখুন

এটি করার পরে আপনার বিল্ডটি পরিষ্কার করার বিষয়টি নিশ্চিত করুন। এক্সকোডের মাঝে মাঝে স্টোরিবোর্ড আপডেটগুলি নিয়ে কিছু সমস্যা থাকে


3
আপনি দুর্দান্ত, পরিষ্কার অনেক কিছুই !! : ডি
স্যান্ডি

2
দ্রষ্টব্য - আপনি যদি "সেল" ব্যতীত কোনও শনাক্তকারী ব্যবহার করেন তবে নীচের লাইনে এই সনাক্তকারীটি ব্যবহার করতে আপনাকে আপনার সেলফোরআউএটিআইডেক্সপথ পদ্ধতিটিও পরিবর্তন করতে হবে: স্ট্যাটিক এনএসএসআরটিং * সেলআইডিটিফায়ার = @ "মাইসেলআইডিটিফায়ার";
gamozzii

5
এটির জন্য একটি গুরুত্বপূর্ণ সংযোজন: টেবিল ভিউটিতে অবশ্যই তার "সামগ্রী" বৈশিষ্ট্যটি "ডায়নামিক প্রোটোটাইপস" এ সেট করা থাকতে হবে, "স্ট্যাটিক সেল" নয়
টেড অ্যাভেরি

এই উত্তরটি আরও বেশি হওয়া উচিত। খুব সহায়ক
সুকিথা উদুগামসুরিয়া

Identifierসম্পত্তি আপডেট করার পরে বিল্ড সাফ করা জরুরি ছিল । ধন্যবাদ!
ক্র্যাশলোট

59

আমি প্রতিস্থাপন একই সমস্যা ছিল

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

   if (cell==nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

    }

মীমাংসিত


ধন্যবাদ. এটি কেবল আমার মাথাব্যথা বাঁচিয়েছে। =)
রবার্ট

3
টিপ: আপনি যদি একটি (আইডি) ডেকিউ ব্যবহার করেন তবে পুনরায় ব্যবহারযোগ্য কেলওয়েথআইডেন্টিফায়ার: ফর ইনডেক্সপথ:, সেলটি শূন্য নয় কিনা তা যাচাই করতে হবে না। (
আইওএস

শুধু আমাকে মাথা ব্যাথা থেকে বাঁচিয়েছে =)
Abo3atef 23'14

26

সমস্যাটি সম্ভবত কারণ আপনি UITableViewCellস্টোরিবোর্ডে কাস্টমটি কনফিগার করেছেন তবে আপনি UITableViewControllerযা ব্যবহার করেন তা ইনস্ট্যান্ট করতে স্টোরিবোর্ড ব্যবহার করেন না UITableViewCell। উদাহরণস্বরূপ, MainStoryboard, আপনি একটি আছে UITableViewControllerউপশ্রেণী নামক MyTableViewControllerএবং একটি কাস্টম গতিশীল আছে UITableViewCellবলা MyTableViewCellআইডেন্টিফায়ার ID "MyCell" সঙ্গে।

আপনি যদি নিজের কাস্টমটি তৈরি করেন তবে UITableViewController:

 MyTableViewController *myTableViewController = [[MyTableViewController alloc] init];

এটি স্বয়ংক্রিয়ভাবে আপনার কাস্টম টেলভিউসেলটি আপনার জন্য নিবন্ধভুক্ত করবে না। আপনাকে এটি ম্যানুয়ালি নিবন্ধন করতে হবে।

তবে আপনি যদি ইনস্ট্যান্টিয়েট করার জন্য স্টোরিবোর্ডটি ব্যবহার করেন তবে MyTableViewController:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
MyTableViewController *myTableViewController = [storyboard  instantiateViewControllerWithIdentifier:@"MyTableViewController"];

সুন্দর জিনিস হয়! UITableViewControllerস্বয়ংক্রিয়ভাবে আপনার কাস্টম টেবিলভিউ সেলটি আপনার জন্য স্টোরিবোর্ডে সংজ্ঞায়িত করবে।

আপনার প্রতিনিধি পদ্ধতিতে "সেলফরআরএটআইডেক্সপ্যাথ" তে আপনি এই জাতীয় টেবিল ভিউ সেল তৈরি করতে পারেন:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"MyCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

//Configure your cell here ...

return cell;
}

পুনর্ব্যবহারযোগ্য সারিতে পুনরায় ব্যবহারযোগ্য ঘর উপলব্ধ না থাকলে DequeueReusableCellWithIdentifier স্বয়ংক্রিয়ভাবে আপনার জন্য নতুন ঘর তৈরি করবে।

তারপরে আপনি হয়ে গেলেন!


instantiateViewControllerWithIdentifierআমার ভিউকন্ট্রোলারটি টিপটি ব্যবহার করে আমার দিনটি বাঁচাল!
লেই ঝাং

আমার দিনটি বাঁচিয়েছিল: প্রোটোটাইপ কোষগুলি একটি টেবিল সহ প্রতিবেশী
ভিসিতে ছিল

এটি আমার ক্ষেত্রে যুক্তিসঙ্গত কারণ।
নোরা আলনাশ্বওয়ান

19

আমি কেবল যুক্ত করব যে এক্সকোড ৪.৫dequeueReusableCellWithIdentifier:forIndexPath:
এর ডিফল্ট টেম্পলেট কোডটিতে নতুনটি রয়েছে - পুরানো dequeueReusableCellWithIdentifier:পদ্ধতিটি প্রত্যাশাকারী বিকাশকারীদের জন্য একটি সম্ভাব্য গোচা got


আমাকে ফাঁসি! এখন আমি আরও ভাল জানি। ;)
স্প্যান্টলে

18

আপনার স্টোরিবোর্ডে আপনার প্রোটোটাইপ সেলটি আপনার সেলরিউজআইডেন্টিফায়ার "সেল" এর মতো হতে হবে Id তারপরে আপনি এই বার্তাটি পাবেন না বা সেই রেজিস্টারক্লাস: ফাংশনটি কল করতে হবে না।


2
Gotcha! '100 upvotes' বোতামটি কোথায়। এটিই আসল সমাধান।
জোজো. লেচেল্ট

আপনি ভাববেন যে স্টোরিবোর্ডে একটি নতুন টেবিলভিউ যুক্ত করা আপনার জন্য একটি ডিফল্ট সনাক্তকারী - 'সেল' সরবরাহ করবে। এটি এত সহজেই উপেক্ষা করা হয়েছে বিশেষত যদি আপনি টেবিলভিউতে তথাকথিত 'ফ্রি কোড' ব্যবহার করছেন: সেলফোরআরএটআইডেক্সপথ!
ushika

18

সুইফট 2.0 সমাধান:

আপনাকে আপনার অ্যাট্রিবিউট ইন্সপেক্টরতে যেতে হবে এবং আপনার সেল আইডেন্টিফায়ারের জন্য একটি নাম যুক্ত করতে হবে:

এখানে চিত্র বর্ণনা লিখুন

তারপরে আপনাকে আপনার শনাক্তকারীর সাথে আপনার শনাক্তকারীকে এটির মতো করে তৈরি করতে হবে:

let cell2 = tableView.dequeueReusableCellWithIdentifier("ButtonCell", forIndexPath: indexPath) as! ButtonCell

বিকল্পভাবে

আপনি যদি কোনও নিবের সাথে কাজ করছেন তবে আপনার ক্লাসটি আপনার সেলফোরোআউটআইডেক্সপ্যাথে রেজিস্ট্রেশন করতে হতে পারে:

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

    tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "SwitchCell")

    // included for context            
    let cell = tableView.dequeueReusableCellWithIdentifier("SwitchCell", forIndexPath:indexPath) as! SwitchCell

    //... continue    
}

আপেলের ইউআইটিএবল ভিউ ক্লাস রেফারেন্স বলেছেন:

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

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

আপেল সুইফট ২.০ ফ্রেমওয়ার্ক থেকে কোডটি এখানে:

// Beginning in iOS 6, clients can register a nib or class for each cell.
// If all reuse identifiers are registered, use the newer -dequeueReusableCellWithIdentifier:forIndexPath: to guarantee that a cell instance is returned.
// Instances returned from the new dequeue method will also be properly sized when they are returned.

@available(iOS 5.0, *)
func registerNib(nib: UINib?, forCellReuseIdentifier identifier: String)

@available(iOS 6.0, *)
func registerClass(cellClass: AnyClass?, forCellReuseIdentifier identifier: String)

বুঝতে পারছি না কোথা SwitchCell.selfথেকে আসছে?
গার্ট কুকেন্স

@ গ্রেটকুইকেনস স্যুইচসেল আমার কাস্টম ইউআইটিএবলভিউসেল
ড্যান

1
আমি এখনই আমার ম্যাক থেকে দূরে আছি, তবে আমি ঘরে পৌঁছে অবশ্যই তা আপডেট করতে পারি।
ড্যান

1
এটিকে প্রতিস্থাপন করা UITableViewCell.selfআমার পক্ষে কাজ করে বলে মনে হচ্ছে। হয়ত উত্তরে একটি নোট যুক্ত করুন
জার্ট কুকেনস

@ গ্রেটকুইকেনস এটিকে নির্দেশ করার জন্য ধন্যবাদ, আমি ইউআইটিবেল ভিউসেল.সেলফের জন্য সুইচসেল.সেলফকে পরিবর্তন করেছি
ড্যান

3

আপনি যদি কাস্টম স্ট্যাটিক সেলগুলি নিয়ে যান তবে কেবল এই পদ্ধতিটিতে মন্তব্য করুন:

//- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//    static NSString *CellIdentifier = @"notificationCell";
//    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
//    return cell;
//}

এবং স্টোরবোর্ডের "বৈশিষ্ট্য পরিদর্শক" এ কক্ষগুলিকে একটি সনাক্তকারী দিন ।


3

আমি আপনাকে উদ্দেশ্য সি এবং সুইফ্ট উভয় ক্ষেত্রে উত্তর দেব B এর আগে আমি বলতে চাই

যদি আমরা এটি ব্যবহার dequeueReusableCellWithIdentifier:forIndexPath:করি তবে অবশ্যই আমাদের অবশ্যই একটি ক্লাস বা নিব ফাইলটি নিবন্ধভুক্ত ব্যবহার করে নিবন্ধ করতে হবে নিব: forCellReuseIdentifier: বা registerClass: forCellReuseIdentifier: পদ্ধতিটি অ্যাপল ডকুমনেটেশন বলে যাবার আগে এই পদ্ধতিটি কল করার আগে

সুতরাং আমরা যোগ করুন registerNib:forCellReuseIdentifier: or registerClass:forCellReuseIdentifier:

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

ViewDidLoad পদ্ধতিতে আমাদের সেলটি নিবন্ধিত করা উচিত

উদ্দেশ্য গ

বিকল্প 1:

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

বিকল্প 2:

[self.tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:@"cell"];

উপরের কোডে nibWithNibName:@"CustomCell"আমার নিব কাস্টমসেলের পরিবর্তে আপনার নিব নাম দিন

স্যুইফ্ট

বিকল্প 1:

tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")

বিকল্প 2:

tableView.registerNib(UINib(nibName: "NameInput", bundle: nil), forCellReuseIdentifier: "Cell") 

উপরের কোডে nibName:"NameInput"আপনার নিব নাম দিন


3

সুইফট 3.0 এর সাথে কাজ করা:

override func viewDidLoad() {
super.viewDidLoad()

self.myList.register(UINib(nibName: "MyTableViewCell", bundle: nil), forCellReuseIdentifier: "Cell")
}



public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = myList.dequeueReusableCell(withIdentifier: "Cell", for: indexPath as IndexPath) as! MyTableViewCell

return cell
}

2

আমি গত রাতে কয়েক ঘন্টা সময় ব্যয় করে ব্যয় করেছি যে কেন আমার প্রোগ্রামগতভাবে উত্পন্ন টেবিলটি [মাই টেবিল সেটডাটা সোর্স: স্ব] -এ ক্র্যাশ হয়েছে; মন্তব্য করা এবং খালি টেবিলটি পপ করা ঠিক ছিল, তবে যতবারই আমি ডাটাসোর্সটিতে পৌঁছানোর চেষ্টা করেছি ক্রাশ হয়েছিল;

আমার কাছে প্রতিনিধিদলটি এইচ ফাইলটিতে স্থাপন করা হয়েছিল: @ আন্তঃ পৃষ্ঠায় আমার ভিউকন্ট্রোলার: ইউআইভিউকন্ট্রোলার

আমার প্রয়োগে ডেটা সোর্স কোড ছিল এবং এখনও বুম !, প্রতিবার ক্রাশ! আপনাকে "xxd" (এনআর 9) ধন্যবাদ: সেই লাইন কোড যুক্ত করা এটি আমার জন্য সমাধান করেছে! আসলে আমি একটি আইবিএक्शन বোতাম থেকে একটি টেবিল চালু করছি, সুতরাং এখানে আমার পূর্ণ কোডটি দেওয়া হয়েছে:

    - (IBAction)tapButton:(id)sender {

    UIViewController* popoverContent = [[UIViewController alloc]init];

    UIView* popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 300)];
    popoverView.backgroundColor = [UIColor greenColor];
    popoverContent.view = popoverView;

    //Add the table
    UITableView *table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 200, 300)         style:UITableViewStylePlain];

   // NEXT THE LINE THAT SAVED MY SANITY Without it the program built OK, but crashed when      tapping the button!

    [table registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
    table.delegate=self;
    [table setDataSource:self];
    [popoverView addSubview:table];
    popoverContent.contentSizeForViewInPopover =
    CGSizeMake(200, 300);

    //create a popover controller
    popoverController3 = [[UIPopoverController alloc]
                          initWithContentViewController:popoverContent];
    CGRect popRect = CGRectMake(self.tapButton.frame.origin.x,
                                self.tapButton.frame.origin.y,
                                self.tapButton.frame.size.width,
                                self.tapButton.frame.size.height);


    [popoverController3 presentPopoverFromRect:popRect inView:self.view   permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];



   }


   #Table view data source in same m file

   - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
   {
    NSLog(@"Sections in table");
    // Return the number of sections.
    return 1;
   }

   - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
  {
    NSLog(@"Rows in table");

    // Return the number of rows in the section.
    return myArray.count;
   }

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath    *)indexPath
    {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    NSString *myValue;

    //This is just some test array I created:
    myValue=[myArray objectAtIndex:indexPath.row];

    cell.textLabel.text=myValue;
    UIFont *myFont = [ UIFont fontWithName: @"Arial" size: 12.0 ];
    cell.textLabel.font  = myFont;

    return cell;
   }

যাইহোক, আপনি যদি পপওভারটিতে অ্যাঙ্কর করতে চান তবে বোতামটি অবশ্যই একটি আইবিএક્શન হিসাবে এবং আইবিআউটলেট হিসাবে যুক্ত থাকতে হবে।

ইউআইপিপওভারকন্ট্রোলার * পপওভারকন্ট্রোলার 3 এইচ ফাইলে সরাসরি ter between এর মধ্যে ইন্টারফেসের পরে ঘোষণা করা হয়


2

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

static NSString *CellIdentifier = @"YourCellIdenifier";

2

আমারও একই সমস্যা ছিল, একই ত্রুটি ছিল এবং আমার জন্য এটি এইভাবে কাজ করেছে:

[self.tableView registerNib:[UINib nibWithNibName:CELL_NIB_HERE bundle: nil] forCellReuseIdentifier:CELL_IDENTIFIER_HERE];

হতে পারে এটি অন্য কারও জন্য উপকারী হবে।


2

আমি স্টোরিবোর্ডে সবকিছু সঠিকভাবে সেটআপ করেছি এবং একটি পরিষ্কার বিল্ড করেছি তবে ত্রুটিটি পেয়েছি " সনাক্তকারীটির জন্য অবশ্যই একটি নিব বা একটি ক্লাস নিবন্ধন করতে হবে বা স্টোরিবোর্ডে একটি প্রোটোটাইপ সেল সংযুক্ত করতে হবে "

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

ত্রুটিটি সংশোধন করেছেন তবে আমি এখনও ক্ষতিতে আছি। আমি কোনও 'কাস্টম সেল' ব্যবহার করছি না, এমবেডেড টেবিলভিউ সহ একটি দৃশ্য। আমি ভিউকন্ট্রোলারকে প্রতিনিধি এবং ডেটাসোর্স হিসাবে ঘোষণা করেছি এবং নিশ্চিত করেছি যে সেল সনাক্তকারীটি ফাইলের সাথে মেলে। এখানে কি হচ্ছে?


1

এটি কিছু লোককে বোকামি বলে মনে হতে পারে তবে তা আমাকে পেয়েছে। আমি এই ত্রুটিটি পাচ্ছিলাম এবং আমার সমস্যাটি হ'ল আমি স্থির ঘরগুলি ব্যবহার করার চেষ্টা করছিলাম তবে গতিশীলভাবে আরও স্টাফ যুক্ত করব add আপনি যদি এই পদ্ধতিটি কল করে থাকেন তবে আপনার কক্ষগুলি গতিশীল প্রোটোটাইপ হওয়া দরকার। স্টোরিবোর্ডে ঘরটি নির্বাচন করুন এবং বৈশিষ্ট্য পরিদর্শকের অধীনে, প্রথম জিনিসটি 'বিষয়বস্তু' বলে এবং আপনার স্থির নয় গতিশীল প্রোটোটাইপগুলি নির্বাচন করা উচিত।


ধন্যবাদ! এটা ঠিক আমার সমস্যা ছিল।
যিশাইয় টার্নার

1

উত্তরের একটি পরিপূরক: আপনি সমস্ত কিছু ঠিক করার সময় থাকতে পারে তবে আপনি ঘটনাক্রমে আপনার মধ্যে কিছু অন্যান্য ইউআই যুক্ত করতে .xibপারেন UIButton: যেমন এখানে চিত্র বর্ণনা লিখুন অতিরিক্ত ইউআই মুছুন, এটি কাজ করে।


1

একটি স্টোরিবোর্ডে ঘরটির পরিচয়কারী সেলআইডেন্টিফায়ার == নিশ্চিত করুন যে দুটি নামই একই are আশা করি এটি আপনার পক্ষে কাজ করে


0

আমার ক্ষেত্রে, কল করার সময় ক্র্যাশ ঘটেছিলdeselectRowAtIndexPath:

লাইন ছিল [tableView deselectRowAtIndexPath:indexPath animated:YES];

এটিকে আমার সমস্যা [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; স্থির করে!

আশা করি এটি যে কাউকে সাহায্য করবে


0

সুইফটে আপনার নিম্নলিখিত কোডগুলি যুক্ত করে এই সমস্যার সমাধান করা যেতে পারে

viewDidLoad

পদ্ধতি।

tableView.registerClass(UITableViewCell.classForKeyedArchiver(), forCellReuseIdentifier: "your_reuse_identifier")

-1

এই ত্রুটি বিসি কক্ষে পুনরায় ব্যবহার শনাক্তকারী ভুল ছিল - একটি ছদ্মবেশী ভুল কিন্তু এটি ঘটে: 1. স্যুর সেল পুনরায় ব্যবহার আইডেন্টিফায়ারকে কোনও ভুল বানান বা অনুপস্থিত অক্ষর নেই। ২. একই লাইনের পাশাপাশি, মূলধন গণনাগুলি ভুলে যাবেন না। ৩. জিরোগুলি "ও" গুলি নয় (ওহস)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.