来自nib的单元格用于UITableView预加载

时间:2015-12-23 12:59:59

标签: ios objective-c uitableview

起初我有这段代码:

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

    DropDownTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"DropDownTableViewCell"];
    if (!cell) {
        NSArray *topLevelObjects =
        [[NSBundle mainBundle] loadNibNamed:@"DropDownView"
                                      owner:self
                                    options:nil];

        for (DropDownTableViewCell *object in topLevelObjects) {
            if ([object class] == [DropDownTableViewCell class]) {
                cell = object;
                break;
            }
        }
        NSAssert(cell, @"Cell must not be nil");
    }

    cell.nameLabel.text = [self.dataSource buttonDownPicker:self stringForRowAtIndexPath:indexPath];

    return cell;
}

在我第一次显示tableView并且tableView单元格从nib开始加载时,我的UI冻结了几秒钟(由于每个显示的单元格从nib加载而导致)。这可以通过先前从nib加载单元格来解决:

- (void)awakeFromNib {
   DropDownTableViewCell *cell = [[[NSBundle mainBundle] loadNibNamed:@"DropDownView" owner:self options:nil] objectAtIndex:0];       
}

但这种方式看起来很“hacky”。有更合适的解决方案吗?

根据给定答案进行编辑:

我曾尝试使用registerNib forCellIdentifier,但它没有LOAD nib,它只是带有标识符的BINDING nib,并且第一次当tableView出现所有导致加载nib到内存的单元格时

3 个答案:

答案 0 :(得分:0)

这不是" hacky"一点都不对于从笔尖加载单元格,您通常会加载笔尖,然后将单元格注册为您选择的可重用标识符。例如,在我的一个项目中,我有一个带有表视图的视图控制器。在视图中加载我调用:

[[NSBundle mainBundle] loadNibNamed:@"ChannelListCell" owner:self options:nil];
[self.channelListTableView registerNib:[UINib nibWithNibName:@"ChannelListCell" bundle:nil] forCellReuseIdentifier:@"channelListCell"];

然后在索引路径的行的单元格中:

cell = [tableView dequeueReusableCellWithIdentifier:@"channelListCell" forIndexPath:indexPath];

在你的情况下,出列的单元格总是为零,因为你没有注册它。

答案 1 :(得分:0)

试试这样......

- (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.

        UINib *nib = [UINib nibWithNibName:@"" bundle:nil];
        [self.tblview registerNib:nib forCellReuseIdentifier:@"DropDownTableViewCell"];
    }

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

        DropDownTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"DropDownTableViewCell"];


        return cell;
    }

答案 2 :(得分:0)

您可以在viewDidLoad中首先注册您的课程,如下图所示。它会更快更好

[self.tableViewObject registerClass: [DropDownTableViewCell class]forCellReuseIdentifier:@"DropDownTableViewCellIdentifier"];

请在DropDownTableViewCell.m文件中添加以下方法

-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"DropDownTableViewCell" owner:self options:nil];
        // Grab a pointer to the first object (presumably the custom cell, as that's all the XIB should contain).
        self = [topLevelObjects objectAtIndex:0];
    return self;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier=@"DropDownTableViewCellIdentifier";
    DropDownTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];

//Access all cell properties here.

return cell.
}

请参阅https://stackoverflow.com/a/30954273/914111以获取更好的知识。