স্টোরিবোর্ডে, আমি একাধিক নিয়ামক দিয়ে কীভাবে কাস্টম সেল করব?


216

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

এখানেই আমি একটি সমস্যায় পড়ছি।

আমি কীভাবে স্টোরিবোর্ডে একটি কাস্টম টেবিলভিউ সেল তৈরি করব যা কোনও ভিউ নিয়ামকটিতে পুনরায় ব্যবহার করা যেতে পারে?

আমি এখন পর্যন্ত চেষ্টা করেছি এমন নির্দিষ্ট জিনিসগুলি এখানে।

  • কন্ট্রোলার # 1 এ, একটি প্রোটোটাইপ সেল যুক্ত করেছেন, আমার UITableViewCellসাবক্লাসে ক্লাস সেট করুন, পুনরায় ব্যবহার আইডি সেট করুন, লেবেলগুলি যুক্ত করেছেন এবং শ্রেণীর আউটলেটগুলিতে তারযুক্ত করেছেন। কন্ট্রোলার # 2 এ, একটি খালি প্রোটোটাইপ সেল যুক্ত করুন, এটি একই শ্রেণিতে সেট করুন এবং আগের মতো আইডি পুনরায় ব্যবহার করুন। এটি যখন চলতে থাকে তখন কক্ষগুলি কন্ট্রোলার # 2-এ প্রদর্শিত হলে লেবেলগুলি কখনই উপস্থিত হয় না। কন্ট্রোলার # 1 এ সূক্ষ্মভাবে কাজ করে।

  • প্রতিটি সেল প্রকারকে আলাদা আলাদা এনআইবিতে নকশাকৃত করে যথাযথ সেল বর্গ পর্যন্ত তারযুক্ত। স্টোরিবোর্ডে, একটি খালি প্রোটোটাইপ সেল যুক্ত করে এর শ্রেণিটি সেট করে এবং আমার সেল শ্রেণীর উল্লেখ করতে আইডি পুনরায় ব্যবহার করুন। নিয়ন্ত্রকদের viewDidLoadপদ্ধতিতে, পুনরায় ব্যবহার আইডির জন্য those এনআইবি ফাইলগুলি নিবন্ধভুক্ত করুন। যখন দেখানো হয়, উভয় নিয়ন্ত্রকের সেলগুলি প্রোটোটাইপের মতো খালি ছিল।

  • উভয় নিয়ন্ত্রকের খালি এবং সেট শ্রেণিতে প্রোটোটাইপ রেখেছি এবং আমার সেল শ্রেণিতে আইডি পুনরায় ব্যবহার করুন। কোডগুলিতে পুরোপুরি ঘরগুলি তৈরি করে। সমস্ত কন্ট্রোলারে সেলগুলি পুরোপুরি কাজ করে।

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

দিনের শেষে, আমি দুটি জিনিস চাই: স্টোরবোর্ডে টেবিলভিউ ভিত্তিক প্রবাহটি ওয়্যার আপ করুন এবং কোডের পরিবর্তে দৃশ্যত সেল লেআউটগুলি সংজ্ঞায়িত করুন। এতদূর দু'জনকে কীভাবে পাব তা আমি দেখতে পাচ্ছি না।

উত্তর:


205

আমি এটি বুঝতে পেরে, আপনি চান:

  1. আইবিতে একটি ঘর ডিজাইন করুন যা একাধিক স্টোরিবোর্ড দৃশ্যে ব্যবহৃত হতে পারে।
  2. সেই কক্ষটি অনন্য স্টোরিবোর্ড সেগগুলি কনফিগার করুন, ঘরে থাকা দৃশ্যের উপর নির্ভর করে।

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

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

  • প্রতিটি প্রোটোটাইপ সেল আসলে তার নিজের এমবেডড মিনি-নিব। সুতরাং যখন টেবিল ভিউ কন্ট্রোলারটি লোড হচ্ছে, এটি প্রোটোটাইপ সেলটির প্রতিটি নিব এবং কলগুলির মধ্য দিয়ে চলে -[UITableView registerNib:forCellReuseIdentifier:]
  • সারণী দর্শনটি কক্ষগুলির জন্য নিয়ামককে জিজ্ঞাসা করে।
  • আপনি সম্ভবত কল -[UITableView dequeueReusableCellWithIdentifier:]
  • আপনি যখন কোনও প্রদত্ত পুনঃব্যবহার শনাক্তকারী সহ কোনও কক্ষের জন্য অনুরোধ করবেন তখন এটি নিব নিবন্ধিত আছে কিনা তা পরীক্ষা করে। যদি এটি করে, এটি সেই ঘরের একটি উদাহরণ ইনস্ট্যান্ট করে। এটি নিম্নলিখিত পদক্ষেপের সমন্বয়ে গঠিত:

    1. ঘরের নিব হিসাবে সংজ্ঞায়িত হিসাবে কক্ষের শ্রেণিটি দেখুন। কল করুন [[CellClass alloc] initWithCoder:]
    2. -initWithCoder:পদ্ধতি মাধ্যমে যায় এবং যোগ subviews এবং সেট বৈশিষ্ট্য যে নিব সংজ্ঞায়িত করা হয়েছে। (এটি IBOutletসম্ভবত এখানেও জড়িয়ে পড়েছে, যদিও আমি এটি পরীক্ষা করি নি; এটি ঘটতে পারে -awakeFromNib)
  • আপনি চাইলে আপনার সেলটি কনফিগার করুন।

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

এটি গুরুত্বপূর্ণ : ঘরের শ্রেণীর নির্দিষ্ট ভিউ হায়ারার্কির সাথে এক থেকে একের সম্পর্ক নেই । এই বিশেষ নিয়ামকের সাথে নিবন্ধিত প্রোটোটাইপ সেলে যা রয়েছে তা দিয়ে ভিউ হায়ারার্কি পুরোপুরি নির্ধারিত হয়।

দ্রষ্টব্য, পাশাপাশি, যে কোনও বিশ্বব্যাপী কোষ ডিসপেনসারিতে কোষটির পুনঃব্যবহার শনাক্তকারী নিবন্ধভুক্ত ছিল না। পুনরায় ব্যবহারকারীর শনাক্তকারী কেবলমাত্র একটি একক UITableViewদৃষ্টিকোণের প্রসঙ্গে ব্যবহৃত হবে ।


এই তথ্যটি দেওয়া, আসুন আপনার উপরের চেষ্টায় কী ঘটেছিল তা দেখুন।

কন্ট্রোলার # 1 এ, একটি প্রোটোটাইপ সেল যুক্ত করেছেন, আমার ইউআইটিএবলভিচেল সাবক্লাসে ক্লাস সেট করুন, পুনরায় ব্যবহার আইডি সেট করুন, লেবেল যুক্ত করেছেন এবং শ্রেণীর আউটলেটগুলিতে তারযুক্ত করেছেন। কন্ট্রোলার # 2 এ, একটি খালি প্রোটোটাইপ সেল যুক্ত করুন, এটি একই শ্রেণিতে সেট করুন এবং আগের মতো আইডি পুনরায় ব্যবহার করুন। এটি যখন চলতে থাকে তখন কক্ষগুলি কন্ট্রোলার # 2-এ প্রদর্শিত হলে লেবেলগুলি কখনই উপস্থিত হয় না। কন্ট্রোলার # 1 এ সূক্ষ্মভাবে কাজ করে।

এটি প্রত্যাশিত উভয় কক্ষের একই শ্রেণি ছিল, যদিও কন্ট্রোলার # 2 এর ঘরে পাঠ্যক্রমের স্তরক্রমটি সম্পূর্ণরূপে বিহীন ছিল। সুতরাং আপনি একটি খালি ঘর পেয়েছেন, যা আপনি প্রোটোটাইপটিতে ঠিক রেখেছিলেন।

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

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

যদিও এই সমাধানটি কাছে ছিল। যেমনটি আপনি উল্লেখ করেছেন, আপনি কেবলমাত্র প্রোগ্রামটি কল করতে পারবেন -[UITableView registerNib:forCellReuseIdentifier:], UINibঘরটি সহ থাকা ঘরটি পেরিয়ে গিয়েছিলেন এবং আপনি সেই একই ঘরটি ফিরে পাবেন। (এটি এ কারণে নয় যে প্রোটোটাইপটি নিবটিকে "ওভাররাইডিং" করছিল; আপনি কেবল নিচটি টেবিলভিউ দিয়ে নিবন্ধন করেন নি, তাই এটি এখনও স্টোরিবোর্ডে থাকা নিবটির দিকে তাকিয়ে ছিল)) দুর্ভাগ্যক্রমে, এই পদ্ধতির কোনও ত্রুটি রয়েছে - স্ট্যান্ডলোন নিবলের কোনও কক্ষে স্টোরিবোর্ডের সেগগুলি হুক আপ করার কোনও উপায় নেই।

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

স্বাভাবিকভাবে. আশা করি, এটি আশ্চর্যজনক নয়।


সুতরাং, যে কারণে এটি কাজ করে না। আপনি নিজের ঘরগুলি স্ট্যান্ডলোন নিবগুলিতে ডিজাইন করতে পারেন এবং সেগুলি একাধিক স্টোরিবোর্ড দৃশ্যে ব্যবহার করতে পারেন; আপনি বর্তমানে স্টোরবোর্ডগুলি সেগুলিতে আলাদা করতে পারবেন না। আশা করি, যদিও আপনি এটি পড়ার প্রক্রিয়াতে কিছু শিখলেন।


আহ, আমি পেয়েছি আপনি আমার ভুল বোঝাবুঝিকে পেরেছিলেন view দৃষ্টিভঙ্গিটি আমার বর্গ থেকে সম্পূর্ণ স্বাধীন। প্রত্যাশায় স্পষ্ট! দুর্দান্ত উত্তরের জন্য ধন্যবাদ।
ক্লিফ ডাব্লু

আর অসম্ভব, আর এটি অসম্ভব বলে মনে হচ্ছে: stackoverflow.com/questions/8574188/…
ধনী অ্যাপোডা

7
@ রিচএপোডাচা আমি আমার উত্তরে সেই সমাধানটির কথা উল্লেখ করেছি। তবে এটি স্টোরিবোর্ডে নেই; এটি একটি পৃথক নিব মধ্যে সুতরাং আপনি আলাদা আলাদা করতে বা অন্য স্টোরিবোর্ড-ইশ জিনিসগুলি করতে পারেন নি। সুতরাং, এটি প্রাথমিক প্রশ্নটিকে পুরোপুরি সমাধান করে না।
বিজে হোমার

এক্সকোড 8 অনুসারে নিম্নলিখিত স্ট্রাকচারটি কাজ করছে বলে মনে হচ্ছে যদি আপনি কেবল স্টোরিবোর্ডই সমাধান চান। পদক্ষেপ 1) ভিউকন্ট্রোলার # 1 এ টেবিলভিউতে আপনার প্রোটোটাইপ সেল তৈরি করুন এবং কাস্টম ইউআইটিএবল ভিউসেল ক্লাসের সাথে যুক্ত করুন পদক্ষেপ 2) ভিউকন্ট্রোলার # 2 এর টেবিলভিউতে সেই ঘরটি অনুলিপি / আটকান। সময়ের সাথে সাথে আপনাকে স্টোরিবোর্ডে তৈরি করা অনুলিপিগুলি মুছে ফেলা এবং আপডেট প্রোটোটাইপে ফিরে আটকানোর মাধ্যমে ম্যানুয়ালি ঘরের অনুলিপিগুলিতে প্রচার করতে হবে।
জেঞ্জেলসমা

দুর্দান্ত উত্তর, যদিও আমি একটি ফলো-আপ প্রশ্ন পেয়েছি যদিও:> "স্টোরিবোর্ড মূলত, .xib ফাইলের সংগ্রহের চেয়ে বেশি কিছু নয়" যদি এটি হয় তবে কেন একটি এক্সবি এম্বেড করা এত কঠিন? একটি স্টোরিবোর্ড?
willcwf

58

বিজে হোমারের দুর্দান্ত উত্তর সত্ত্বেও আমার মনে হচ্ছে আমার একটি সমাধান রয়েছে। আমার পরীক্ষা যতদূর যায়, এটি কাজ করে।

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

উদাহরণ

আমার DetailedTaskCell.xibএকটি টেবিল সেল রয়েছে যা আমি একাধিক টেবিল ভিউগুলিতে ব্যবহার করতে চাই:

DetailedTaskCell.xib

TaskGuessTableCellসেই ঘরের জন্য একটি কাস্টম ক্লাস রয়েছে :

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

জাদু ঘটবে এই যেখানে।

// TaskGuessTableCell.h
#import <Foundation/Foundation.h>

@interface TaskGuessTableCell : UITableViewCell
@property (nonatomic, weak) UIViewController *controller;
@end

// TashGuessTableCell.m
#import "TaskGuessTableCell.h"

@implementation TaskGuessTableCell

@synthesize controller;

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSIndexPath *path = [controller.tableView indexPathForCell:self];
    [controller.tableView selectRowAtIndexPath:path animated:NO scrollPosition:UITableViewScrollPositionNone];
    [controller performSegueWithIdentifier:@"FinishedTask" sender:controller];
    [super touchesEnded:touches withEvent:event];
}

@end

আমি একাধিক Segues আছে কিন্তু তারা সব একই নাম: "FinishedTask"। আপনার যদি এখানে নমনীয় হতে হয় তবে আমি অন্য সম্পত্তি যুক্ত করার পরামর্শ দিই।

ভিউকন্ট্রোলার এর মতো দেখাচ্ছে:

// LogbookViewController.m
#import "LogbookViewController.h"
#import "TaskGuessTableCell.h"

@implementation LogbookViewController

- (void)viewDidLoad
{
    [super viewDidLoad]

    // register custom nib
    [self.tableView registerNib:[UINib nibWithNibName:@"DetailedTaskCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"DetailedTaskCell"];
}

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

    cell = [tableView dequeueReusableCellWithIdentifier:@"DetailedTaskCell"];
    cell.controller = self; // <-- the line that matters
    // if you added the seque property to the cell class, set that one here
    // cell.segue = @"TheSegueYouNeedToTrigger";
    cell.taskTitle.text  = [entry title];
    // set other outlet values etc. ...

    return cell;
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([[segue identifier] isEqualToString:@"FinishedTask"])
    {
        // do what you have to do, as usual
    }

}

@end

একই অর্জনের জন্য আরও মার্জিত উপায় থাকতে পারে তবে - এটি কার্যকর! :)


1
ধন্যবাদ, আমি আমার প্রকল্পে এই পদ্ধতির প্রয়োগ করছি। পরিবর্তে আপনি এই পদ্ধতিটি ওভাররাইড করতে পারেন সুতরাং আপনাকে সূচিপথটি পেতে হবে না এবং নিজেই সারিটি নির্বাচন করতে হবে: - (শূন্য) সেটসেলেক্ট: (বিওএল) অ্যানিমেটেড: (বিওএল) অ্যানিমেটেড {[সুপার সেটস্লেক্সড: নির্বাচিত অ্যানিমেটেড: অ্যানিমেটেড]; যদি (নির্বাচিত) [সেলফ্রন্ট কন্ট্রোলার পারফরম্যান্সসেটউইথআইডিটিফায়ার: সেলফ সিগ প্রেরক: স্ব]; } আমি ভেবেছিলাম সুপার কল করার সময় সেলটি নির্বাচন করবে [সুপার টাচসইড: স্পর্শ উইন্ডো: ইভেন্ট] ;. আপনি যদি জানেন না এটি কবে না নির্বাচিত হয়?
thejaz

9
মনে রাখবেন যে এই সমাধানের সাহায্যে, আপনি যখনই কোনও ঘরের অভ্যন্তরে কোনও স্পর্শ শেষ করেন আপনি সেগটিকে ট্রিগার করছেন। এটি অন্তর্ভুক্ত করে যদি আপনি কেবল সেলটি স্ক্রোল করে থাকেন, বাস্তবে এটি নির্বাচন করার চেষ্টা না করে। আপনার ভাগ্যটি -setSelected:সেলটিতে ওভাররাইডিং হতে পারে এবং সিগ থেকে ট্রিগার কেবল তখন স্থানান্তরিত NOকরতে পারে YES
বিজে হোমার

আমার সাথে ভাগ্য ভাল setSelected:, বিজে। ধন্যবাদ। প্রকৃতপক্ষে, এটি একটি অবাস্তব সমাধান (এটি ভুল অনুভব করে ), তবে একই সাথে এটিও কাজ করে, সুতরাং এটি স্থির না হওয়া পর্যন্ত আমি এটি ব্যবহার করছি (বা অ্যাপলের আদালতে কিছু পরিবর্তন হয়েছে)।
বেন ক্রিগার

16

আমি এটি খুঁজছিলাম এবং আমি রিচার্ড ভেনেবলের এই উত্তরটি পেয়েছি । এটা আমার জন্য কাজ করে.

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

এটি ব্যবহার করতে, একটি নিবিটে একটি ইউআইটিএবলভিউসেল রাখুন। এটি নিবের একমাত্র মূল অবজেক্ট হতে হবে।

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


10

বিজে হোমার যা চলছে তার একটি দুর্দান্ত ব্যাখ্যা দিয়েছেন।

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

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


10

সুইফট 3

বিজে হোমার একটি দুর্দান্ত ব্যাখ্যা দিয়েছেন, এটি আমাকে ধারণাটি বুঝতে সহায়তা করে। করতে make a custom cell reusable in storyboardযা কোনো TableViewController ব্যবহার করা যেতে পারে, আমরা আছে mix the Storyboard and xibপদ্ধতির। ধরুন আমরা একটি সেল নামে আছে CustomCellব্যবহৃত হবে যা TableViewControllerOneএবং TableViewControllerTwo। আমি এটি পদক্ষেপে তৈরি করছি।
1. ফাইল> নতুন> ফাইল ক্লিক করুন> কোকো টাচ ক্লাস নির্বাচন করুন> পরবর্তী ক্লিক করুন> আপনার শ্রেণীর নাম দিন (উদাহরণস্বরূপ CustomCell)> সাবট্লাসটি ইউআইটিএবলভিসেল হিসাবে নির্বাচন করুন> এক্সআইবি ফাইল চেকবক্সও টিক করুন এবং পরবর্তী টিপুন।
২. আপনার ইচ্ছা অনুযায়ী ঘরটি কাস্টমাইজ করুন এবং সেলটির জন্য অ্যাট্রিবিউট ইন্সপেক্টরটিতে সনাক্তকারী সেট করুন, আমরা এখানে হিসাবে সেট করব CellIdentifier। এই সনাক্তকারীটি আপনার ভিউকন্ট্রোলারে ব্যবহৃত হবে সেলটি সনাক্ত করতে এবং পুনরায় ব্যবহার করতে।
৩. এখন আমাদের শুধু করতে হবেregister this cellআমাদের ভিউকন্ট্রোলারে viewDidLoad। কোনও সূচনা পদ্ধতির দরকার নেই।
৪. এখন আমরা যেকোন টেবিল ভিউতে এই কাস্টম সেলটি ব্যবহার করতে পারি।

টেবিলভিউকন্ট্রোলারএনে

let reuseIdentifier = "CellIdentifier"

override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: reuseIdentifier)
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier:reuseIdentifier, for: indexPath) as! CustomCell
    return cell!
}

5

আমি একই ভিসির জন্য সেল লোড করার একটি উপায় খুঁজে পেয়েছি, সেগগুলি জন্য পরীক্ষা করা হয়নি। এটি পৃথক স্তম্ভের মধ্যে কক্ষ তৈরির জন্য কার্যকর হতে পারে

ধরা যাক যে আপনার একটি ভিসি এবং 2 টি টেবিল রয়েছে এবং আপনি স্টোরিবোর্ডে একটি ঘর ডিজাইন করতে এবং এটি দুটি টেবিলটিতে ব্যবহার করতে চান।

(উদাহরণস্বরূপ: ফলাফলের জন্য একটি সারণী সহ একটি ইউআইএস সার্চ কন্ট্রোলার সহ একটি টেবিল এবং একটি অনুসন্ধান ক্ষেত্র এবং আপনি উভয় ক্ষেত্রে একই সেলটি ব্যবহার করতে চান)

কন্ট্রোলার যখন কক্ষটি জিজ্ঞাসা করে তখন এটি করুন:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString * identifier = @"CELL_ID";

    ContactsCell *cell = [self.YOURTABLEVIEW dequeueReusableCellWithIdentifier:identifier];
  // Ignore the "tableView" argument
}

এবং এখানে আপনার স্টোরবোর্ড থেকে আপনার সেল রয়েছে


আমি এটি চেষ্টা করেছি এবং কোষগুলি কখনই পুনরায় ব্যবহার করা হবে না সেগুলি কাজ করে বলে মনে হচ্ছে। সিস্টেমটি সর্বদা প্রতিটি সময় নতুন ঘর তৈরি করে এবং ডিলোক্স করে।
গিল্রোয় কিলরোয় 6'15

এটি একই প্রস্তাবনা যা স্টোরিবোর্ডগুলির সাথে একটি সারণী দর্শনতে একটি অনুসন্ধান বার যুক্ত করতে পাওয়া যায় । আপনি যদি আগ্রহী হন তবে এই সমাধানটির আরও গভীরতর ব্যাখ্যা রয়েছে (অনুসন্ধান করুন tableView:cellForRowAtIndexPath:)।
সংবেদনশীল

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