নিব থেকে পুনরায় ব্যবহারযোগ্য UITableViewCell লোড করা হচ্ছে


89

আমি কাস্টম ইউআইটিএবলভিউকেলগুলি ডিজাইন করতে সক্ষম হয়েছি এবং http://forums.macrumors.com/showthread.php?t=545061 এ পাওয়া থ্রেডে বর্ণিত কৌশলটি ব্যবহার করে সেগুলি ঠিকঠাক লোড করতে সক্ষম । তবে, সেই পদ্ধতিটি ব্যবহার করা আপনাকে আর পুনরায় ব্যবহারকারীর সাহায্যে সেলটি চালিত করার অনুমতি দেয় না যার অর্থ আপনাকে প্রতিটি কলটিতে প্রতিটি ঘরের পুরো নতুন ইনস্ট্যান্স তৈরি করতে হবে। পুনরায় পুনঃব্যবহারের জন্য নির্দিষ্ট কোষের ধরণগুলি এখনও কেশ করার জন্য কোনও ভাল উপায় বের করেছে তবে এখনও সেগুলি ইন্টারফেস বিল্ডারে ডিজাইন করতে সক্ষম হবে?

উত্তর:


74

উপযুক্ত পদ্ধতি স্বাক্ষর সহ একটি পদ্ধতি কেবল প্রয়োগ করুন:

- (NSString *) reuseIdentifier {
  return @"myIdentifier";
}

কোথায় এই পদ্ধতি বাস্তবায়ন?
কৃষ্ণন

4
আপনার ইউআইটিএবলভিউসেল সাবক্লাসে। বিকাশকারী.এপ্লে.লাইবারি
আইওএস

4
এটি ঝুঁকিপূর্ণ। আপনার ঘরের সাবক্লাসের দুটি সাবক্লাস থাকলে এবং এই দুটিই একক টেবিল দৃশ্যে ব্যবহার করলে কী হবে? যদি তারা পুনরায় ব্যবহারের শনাক্তকারী কলটি সুপারের কাছে প্রেরণ করে তবে আপনি ভুল ধরণের একটি সেল শনাক্ত করতে পারেন .............. আমি মনে করি আপনাকে পুনরায় ব্যবহারকারীর পরিচয় পদ্ধতিটি ওভাররাইড করতে হবে, তবে এটি একটি অনুবর্তিত শনাক্তকারীকে ফিরিয়ে দেবে স্ট্রিং
এসকে 9

4
এটি অনন্য বলে নিশ্চিত হওয়ার জন্য, আপনি এটি করতে পারেন:return NSStringFromClass([self class]);
আইভানজয়েড

119

আসলে, যেহেতু আপনি ইন্টারফেস বিল্ডারে সেল তৈরি করছেন, কেবল সেখানে পুনরায় ব্যবহারকারীর শনাক্তকরণটি সেট করুন:

আইবি_রিউজ_আইডেন্টিফায়ার

বা আপনি যদি এক্সকোড 4 চালাচ্ছেন তবে বৈশিষ্ট্য পরিদর্শক ট্যাবটি দেখুন:

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

(সম্পাদনা করুন: আপনার এক্সআইবি এক্সকোড দ্বারা উত্পাদিত হওয়ার পরে এটিতে একটি খালি ইউআইভিউ রয়েছে, তবে আমাদের একটি ইউআইটিএবলভিউসেল প্রয়োজন; সুতরাং আপনাকে নিজেই ইউআইভিউউভটি সরাতে হবে এবং একটি সারণী দর্শন ঘরটি সন্নিবেশ করতে হবে। অবশ্যই, আইবি কোনও ইউআইটিএবলভিউসেল পরামিতি প্রদর্শন করবে না ইউআইভিউ।)


আমি শনাক্তকারীদের কী সেট করব, যদি আমি এই নিবটি একাধিক কোষের জন্য তৈরি ঘর ব্যবহার করি? এটি আমাদের একই শনাক্তকারী সহ দুটি কক্ষ নিয়ে যাবে।
কৃষ্ণন

4
এটিকে কোনও অনন্য সনাক্তকারী হিসাবে ভাবেন না - এটিকে আরও টাইপের নামের মতো ভাবেন।
টিম কিটিং

এক্সকোড ৪.৩.৩ এ অন্তর্নির্মিত ইন্টারফেস বিল্ডারের মাধ্যমে সনাক্তকারী সেট করার বিকল্পটি আমি দেখছি না। আমি অবশ্যই আমার ইউআইটিএবলভিউসেল সাবক্লাসে ক্লাসটি সেট করছি। আমি কি শুধু এটি মিস করছি, বা এটি চলে গেছে?
টাইলার

4
ঠিক আছে, আমি আমার সমস্যা সমাধান করেছি। আপনি যদি ইন্টারভিউস বিল্ডারে (এক্সকোড 4 এর মধ্যে) কোনও ইউআইভিউ অবজেক্ট দিয়ে শুরু করেন এবং এর শ্রেণিটি ইউআইটিএবলভিউসেলতে পরিবর্তন করেন তবে আপনি পুনরায় ব্যবহারকারীর শনাক্তকরণের মতো ঘর নির্দিষ্ট বৈশিষ্ট্য পাবেন না। এটি পেতে, আপনার একটি খালি xib দিয়ে শুরু করার কথা রয়েছে এবং কোনও টেবিল ঘর অবজেক্টে টেনে আনতে হবে, যার পরে আপনার সম্পাদনা করতে পারে এমন সেল-নির্দিষ্ট বৈশিষ্ট্য থাকবে।
টাইলার

4
@ কৃষ্ণান এটিকে এভাবে ভাবুন - আপনি যখন শনাক্তকারী এক্স সহ টেবিল ভিউ সেল তৈরি করবেন, আপনি বলছেন "এক্স লেবেলযুক্ত পুলটি আমাকে একটি সেল দিন" " যদি পুলটি বিদ্যমান থাকে এবং সেখানে কোনও নিখরচায় সেল থাকে তবে তা এটি আপনাকে দেয়। অন্যথায়, এটি পুলটি তৈরি করে (প্রয়োজনে), তারপরে সেলটি সংবাদ করে, এটি "এক্স" লেবেল করে, এবং এটি আপনার হাতে দেয়। সুতরাং কোষগুলি অনন্য হতে পারে - যেমন আপনি নির্দিষ্ট সনাক্তকারী দিয়ে কেবল একটি কক্ষ সহ একটি পুল তৈরি করতে পারেন - তবে গ্রন্থাগার মেমরির বরাদ্দ / ডেলোক এড়াতে একটি বিনামূল্যে তালিকা-জাতীয় কৌশল ব্যবহার করে।
টিম কেটিং

66

এখন, আইওএস 5 এ এর ​​জন্য উপযুক্ত ইউআইটিএবলভিউ পদ্ধতি রয়েছে:

- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier

10
গৃহীত উত্তর সহ এই থ্রেডের অন্যান্য জবাবগুলিতে পুরানো পরামর্শ রয়েছে।
Kaelin Colclasure

এই পিছনে সামঞ্জস্যপূর্ণ? আমার অর্থ যদি আমি এসডিকে 5.0 দিয়ে একটি অ্যাপ্লিকেশন বিকাশ করি এবং সর্বনিম্ন 4.0 টার্গেট করে অ্যাপটি আইওএস 4.0 এর সাথে ডিভাইসগুলিতে চালিত হয়?
আবলফুউড

4
না, এটি আইওএস 5.0 তে কোনও নতুন এপিআই হিসাবে পিছনের দিকে সামঞ্জস্যপূর্ণ নয়।
মার্জপাওয়ার

কীভাবে এটি আপনার নিয়ামকের সাথে সংহত করতে হবে তার উদাহরণ কাজ করেছেন: মাইন্ডফায়ারলিউশনস //…
এমব্ল্যাকওয়েল 8

47

আমি এই কোডটি মূলত কোথায় পেয়েছি তা মনে করতে পারছি না, তবে এটি এখনও পর্যন্ত আমার পক্ষে দুর্দান্ত কাজ করছে।

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

    static NSString *CellIdentifier = @"CustomTableCell";
    static NSString *CellNib = @"CustomTableCellView";

    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellNib owner:self options:nil];
        cell = (UITableViewCell *)[nib objectAtIndex:0];
    }

    // perform additional custom work...

    return cell;
}

ইন্টারফেস বিল্ডার সেটআপ উদাহরণ ...

বিকল্প পাঠ


12

এই প্রশ্নের আমি যে উত্তর দিয়েছি তা দেখুন:

ইন্টারফেস বিল্ডারে এনএসসেল সাবক্লাস ডিজাইন করা কি সম্ভব?

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

আমি গতবছর ডাব্লুডাব্লুডিসিতে উপস্থাপকদের কয়েকজনের কাছ থেকে শুনেছিলাম যে আপনি আইবিতে টেবিল ভিউ সেলগুলি তৈরি করবেন না, তবে এটি অনেকটাই বোঝা।


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

4
সত্য, তবে এরপরেও আইবিতে নির্মিত কোষগুলির সহজ রক্ষণাবেক্ষণের জন্য আপনি পুরানো ডিভাইসগুলিতে পারফরম্যান্সকে কিছুটা ক্ষতিগ্রস্থ হতে দেওয়া ভাল better আপনি এই কৌশলটি কোনও টেম্পলেট সেল হিসাবে ব্যবহার করতে পারেন যা আপনি কাস্টম ড্র পদ্ধতির সাথে মিশ্রণ এড়াতে উপাদানগুলি আঁকেন।
কেন্ডাল হেলমেস্টেটার জেলনার

7

আইওএস প্রায় ৪.০ হিসাবে, আইওএস ডক্সে নির্দিষ্ট নির্দেশাবলী রয়েছে যা এই কাজটিকে অতি দ্রুত করে তোলে:

http://developer.apple.com / লাইব্রেরি / আইস /# ডকুমেন্টেশন / ইউজার এক্সপেরিয়েন্স / কনসেপ্টুয়াল / টেবিলভিউ_আইফোন / টেবিলভিউ সেলস / টেবিলভিউ সেলস html#//apple_ref/doc/uid/TP40007451-CH7

যেখানে UITableViewCell সাবক্লাসিংয়ের কথা বলে সেখানে নীচে স্ক্রোল করুন।


6

এখানে আরও একটি বিকল্প রয়েছে:

NSString * cellId = @"reuseCell";  
//...
NSArray * nibObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomTableCell" owner:nil options:nil];

for (id obj in nibObjects)
{
    if ([obj isKindOfClass:[CustomTableCell class]])
    {
        cell = obj;
        [cell setValue:cellId forKey:@"reuseIdentifier"];
        break;
    }
}

মনে রাখবেন যে এটি এখন পর্যন্ত পোস্ট করা একমাত্র সমাধান যা এর UITableViewCellজন্য একটি অনন্য মান সেট করতে আপনার কাস্টমকে সাবক্লাসিংয়ের প্রয়োজন হয় না reuseIdentifer। আমি মনে করি মূল অপ্টটি আসলে এটিই খুঁজছিল।
চরশেপ

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

এটি ম্যানুয়ালি সেট করার জন্য কোনও ইউআইটিএবলভিউসেল পদ্ধতি নেই বলে খুব সহায়ক!
জেসি

2

আমি আমার কাস্টম ভিউ সেলগুলিকে একইভাবে তৈরি করি - আমি IBOutlet এর মাধ্যমে সেলটি সংযোগ ব্যতীত।

[nib objectAt...]পদ্ধতির অ্যারের মধ্যে আইটেম অবস্থানের পরিবর্তন সমর্থ হয়।

UIViewControllerপদ্ধতির ভালো - শুধু এটা চেষ্টা, এবং এটি চমৎকার যথেষ্ট কাজ করে।

কিন্তু ...

সমস্ত ক্ষেত্রে initWithStyleকনস্ট্রাক্টরকে ডাকা হয় না, সুতরাং কোনও ডিফল্ট সূচনা হয় না।

আমি ব্যবহার সম্পর্কে বিভিন্ন জায়গা পড়েছি initWithCoderবা করেছি awakeFromNib, তবে এর কোনওটিই সঠিক উপায় নয় এমন কোনও চূড়ান্ত প্রমাণ নেই।

পদ্ধতিটিতে স্পষ্টভাবে কিছু সূচনা পদ্ধতি কল করা ছাড়াও cellForRowAtIndexPathআমি এর কোনও উত্তর পাই না।


এনআইবি থেকে লোড হওয়া কোনও বস্তুর প্রতিক্রিয়া জানানোর সঠিক উপায় হ'ল জাগ্রত থেকে ক্রমনিব।
জন হেস

2

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

আপনার সমস্ত উইজেটগুলি রাখার জন্য আপনি একটি সাধারণ ধারক ইউআইভিউ দিয়ে শেষ করেছেন এবং স্ক্রোলিং দ্রুত বাজছে।

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


2

এই কৌশলটিও কাজ করে এবং মেমরি পরিচালনার জন্য আপনার ভিউ কন্ট্রোলারে একটি মজার আইভারের প্রয়োজন হয় না। এখানে, কাস্টম টেবিল ভিউ সেলটি "কাস্টমসেল.এক্সিব" নামে একটি এক্সিবায় বাস করে।

 static NSData *sLoadedCustomCell = nil;

 cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
 if (cell == nil) 
 {
   if (sLoadedCustomCell == nil) 
   {        
      // Load the custom table cell xib
      // and extract a reference to the cell object returned
      // and cache it in a static to avoid reloading the nib again.

      for (id loadedObject in [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:nil options:nil]) 
      {
        if ([loadedObject isKindOfClass:[UITableViewCell class]]) 
        {
          sLoadedCustomCell = [[NSKeyedArchiver archivedDataWithRootObject: loadedObject] retain];
          break;
        }
    }
    cell = (UITableViewCell *)[NSKeyedUnarchiver unarchiveObjectWithData: sLoadedCustomCell];
  }

4
সংরক্ষণাগারভুক্ত এবং আর্কাইভ সংরক্ষণ সম্পূর্ণ অপ্রয়োজনীয়।
ব্রায়ান হেনরি

4
আর্কাইভ / আর্কাইভ সংরক্ষণ অপ্রয়োজনীয় যদি আপনি তার নিব থেকে সেল লোড করার ক্ষেত্রে ঠিক থাকেন তবে যখনই এটি শনাক্ত করা যায় না। তবে, আপনি যদি কেবল তার নিব থেকে সেলটি ঠিক একবারে লোড করতে চান , তবে আপনাকে এটি মেমরির মধ্যে ক্যাশে করতে হবে। আমি এনএসকিডআরচাইভিং ব্যবহার করে সেই ক্যাচিংটি সম্পন্ন করেছি কারণ ইউআইটিএবলভিচেল এনএসকোপিং প্রয়োগ করে না।
বিল গ্যারিসন

4
যা বলা হয়েছিল, সেলটি লোড করতে ইউআইএনআইবি ব্যবহার করে একই প্রভাবটি অর্জন করে: একবার ডিস্ক থেকে লোড করুন, তারপরে স্মৃতি থেকে লোড করুন।
বিল গ্যারিসন

2

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{   
    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"CustomCellId"];

    if (cell == nil) 
    {
        UIViewController *c = [[UIViewController alloc] initWithNibName:@"CustomCell" bundle:nil];
        cell = (PostCell *)c.view;
        [c release];
    }

    return cell;
}

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

static NSString *simpleTableIdentifier = @"CustomCell";

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

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
}         

return cell;
}

1

গুস্তাভোগ সমাধান আমার পক্ষে কাজ করে না, আমি যা চেষ্টা করেছি তা হ'ল:

ChainesController *c = [[ChainesController alloc] initWithNibName:@"ChainesController" bundle:nil];
[[NSBundle mainBundle] loadNibNamed:@"ChaineArticleCell" owner:c options:nil];
cell = [c.blogTableViewCell retain];
[c release];

মনে হচ্ছে এটি কাজ করে। ব্লগ টেবিলভিউসেল হ'ল সেলটির আইবিআউটলেট এবং চেইনসন্ট্রোলার ফাইলটির মালিক।


1

সম্পর্কিত ইউআইটিএবলভিউ ডক্স থেকে dequeueWithReuseIdentifier: "সেল স্ট্রিমটি পুনঃব্যবহারের জন্য চিহ্নিত একটি স্ট্রিং default

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


0

এটির মূল্যের জন্য আমি একটি আইফোন ইঞ্জিনিয়ারকে আইফোন টেক আলোচনার একটিতে এ সম্পর্কে জিজ্ঞাসা করেছি। তার উত্তর ছিল, "হ্যাঁ, কোষ তৈরি করতে আইবি ব্যবহার করা সম্ভব। তবে করবেন না। দয়া করে, করবেন না।"


4
অদ্ভুত জিনিস. এনওয়াই টক-এ অন্তত দুটি আলোচনার ডেমো কোড ছিল যা আইবিতে তৈরি সেল ব্যবহার করেছিল।
শন ক্র্যাভার

4
অ্যাপলের উন্নত টেবিল ভিউ সেল উদাহরণ প্রকল্পে তারা আইবি ব্যবহার করে যেহেতু আমি এটি বিশ্বাস করি তা নিশ্চিত নয়।
21

তার জন্য ধন্যবাদ. যতবার আমি এটি করেছি ততবার আমি সমস্যার মধ্যে পড়েছি। এটি কারণ হতে পারে
স্কোরুলিস

এ সম্পর্কে সম্ভবত তাঁর যথেষ্ট জ্ঞান ছিল না।
aryaxt

0

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

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