Load custom UITableViewCell from Storyboard

2019-03-28 10:48发布

问题:

Currently I'm using auto layout with storyboard to dynamically resize custom UITableViewCell's. Everything is working as it should except there is memory leak when scrolling.

I know the problem is from calling

[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

from inside

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

My question is this, what would be the best way to create a reference cell? How to load a cell from storyboard without dequeueReusableCellWithIdentifier?

And is it ok to maybe call dequeueReusableCellWithIdentifier from viewDidLoad and create a reference cell as a property?

I need reference cell for sizing purposes.

Thanks for any help.

回答1:

Regarding how to create reference cell (see original question), there are couple of options as I can see:

  1. create a custom cell with XIB, great article here -> a link!

    • this was pointed out to me by @smileyborg, thanks!
  2. create your custom cell in code, along with constraints.

  3. create your custom cell in storyboard as prototype cell

    • after that there are 2 options:
      • drag and drop custom cell from table view to the storyboard scene, as a top level nib object (not part of the view hierarchy), and simply create outlet to it.
      • copy custom cell and paste it to the storyboard scene. When using it this way, there is no need to register original cell with table for dequeue.
      • minor problem with both approaches is that once you drag and drop custom cell to the storyboard scene, you will not be able to see it visually and arrange UI.
    • great article here -> a link!

Thanks everyone for help!



回答2:

And is it ok to maybe call dequeueReusableCellWithIdentifier from viewDidLoad and create a reference cell as a property?

Yes, you can do this. Or lazy initialize the property:

- (UITableViewCell *)referenceCell
{
    if (!_referenceCell) {
        _referenceCell = [self.tableView dequeueReusableCellWithIdentifier:@"Cell"];
    }
    return _referenceCell;
}


回答3:

You can just dequeue the cell once and store the height:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSNumber *height;

    if (!height) 
    {
        UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"YourCustomCell"];
        height = @(cell.bounds.size.height);
    }

    return [height floatValue];
}