iOS:dequeueReusableCellWithIdentifier返回IBOutlets为nil的单元格

时间:2016-02-02 01:26:01

标签: ios objective-c uitableview

我有一个自定义UITableViewCell,其中一个视图在XIB文件中定义:

@interface MetroTableViewCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UILabel *metroLineName;
@end

我正在将细胞出列:

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

    MetroTableViewCell *cell = (MetroTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"MetroTableViewCell" forIndexPath:indexPath];

    // AT THIS POINT, cell.metroLineName is equal to nil
    return cell;
}

该类正在使用表视图进行注册:

[self.tableView registerClass:[MetroTableViewCell class]
       forCellReuseIdentifier:@"MetroTableViewCell"];

在XIB文件中,我还将类设置为" MetroTableViewCell"

那么为什么IBOutlet设置为nil?

注意:使用时不会发生此问题:

MetroTableViewCell *cell = [[[NSBundle mainBundle] loadNibNamed:@"MetroTableViewCell"
                                                              owner:self options:nil]
                                                      objectAtIndex:0];

2 个答案:

答案 0 :(得分:1)

因为您创建了一个xib节目,所以您需要registerNib而不是类。如果您创建没有xib的自定义单元格,则会使用registerClass

所以你应该改变这段代码:

[self.tableView registerClass:[MetroTableViewCell class]
   forCellReuseIdentifier:@"MetroTableViewCell"];

要:

[self.tableView registerNib:[UINib nibWithNibName:@"MetroTableViewCell" bundle:nil] forCellReuseIdentifier:@"MetroTableViewCell"];

希望这有帮助!

答案 1 :(得分:1)

使用registerClass:forReuseIdentifier:并不使用NIB来创建单元格。它只是创建给定类的新实例。

您想使用registerNib:forReuseIdentifier:

而不是:

[self.tableView registerClass:[MetroTableViewCell class]
   forCellReuseIdentifier:@"MetroTableViewCell"];

使用:

[self.tableView registerNib:[UINib nibWithNibName:@"MetroTableViewCell" bundle: nil]
   forCellReuseIdentifier:@"MetroTableViewCell"];