Load custom UITableViewCell from Storyboard

2019-03-28 11:01发布

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.

3条回答
Explosion°爆炸
2楼-- · 2019-03-28 11:26

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楼-- · 2019-03-28 11:32

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!

查看更多
何必那么认真
4楼-- · 2019-03-28 11:46

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];
}
查看更多
登录 后发表回答