Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you load a prototype cell from a storyboard?

Is there a way to load a prototype cell, along with any IBOutlet connections as defined within a storyboard?

Update

I want to unit test the cell (a UICollectionViewCell for that mater), hence would like to load it outside of a UIViewController context.

Effectively, in the same way that you can load a custom view from a nib, specifying its file's owner and have its IBOutlet(s) set.

like image 886
qnoid Avatar asked Mar 07 '14 17:03

qnoid


People also ask

What is prototype cell?

A prototype cell acts a template for your cell's appearance. It includes the views you want to display and their arrangement within the content area of the cell. At runtime, the table's data source object creates actual cells from the prototypes and configures them with your app's data.

What is UITableView in Swift?

A view that presents data using rows in a single column.

What is dequeueReusableCell?

dequeueReusableCell(withIdentifier:)Returns a reusable table-view cell object after locating it by its identifier.


2 Answers

Edit: As far as I know, it's not possible to use prototype UITableViewCells from a Storyboard anywhere other than the ViewController you created it in.

I haven't tried this with unit tests yet but you can easily put your custom UITableViewCell into a separate nib.

For using it in your view controllers you need to register the cell with your tableViews.

UINib *nib = [UINib nibWithNibName:@"ABCNameOfYourNibCell" bundle:nil];
[self.tableView registerNib:nib forCellReuseIdentifier:@"myCustomCell"];

Then use the cell like this in cellForRowAtIndexPath:

static NSString *CellIdentifier = @"myCustomCell";

ABCNameOfYourNibCell *cell = 
[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

For your testing purposes you should be able to go with:

ABCNameOfYourNibCell *testCell = 
[[ABCNameOfYourNibCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier:nil];

If you need to test reuse-behaviour, you should set a reuseIdentifier here and call prepareForReuse on the cell.

like image 149
flo Avatar answered Oct 22 '22 08:10

flo


Normally you crete an UITableViewController or a UITableView. Than you should also create a UITableViewCell class. After creating the UITableViewCell class, go to the `UIStoryboard, select the cell :

enter image description here

Then set the UITableViewCell class inside the Identity Inspector:

enter image description here

Now add elements to the UITableViewCell and connect them with your class

enter image description here

Now add the CellIdentifier inside the Attributes Inspector:

enter image description here

No got to your UITableViewController or the UIViewController where you have the UITableViewDelegate methods and call your cell like this (don't forget to #import the UITableViewCell class at the top of your ViewController:

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

    static NSString *CellIdentifier = @"MyIdentifier";
    MyCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier 
                                                   forIndexPath:indexPath];

    [cell.label setText:[NSString stringWithFormat:@"My Cell at Row %ld", 
                         (long)indexPath.row]];      
    return cell;
}
like image 30
Alex Cio Avatar answered Oct 22 '22 08:10

Alex Cio