How do you load a prototype cell from a storyboard

2019-01-18 20:17发布

问题:

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.

回答1:

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.



回答2:

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 :

Then set the UITableViewCell class inside the Identity Inspector:

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

Now add the CellIdentifier inside the Attributes Inspector:

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;
}