起初我有这段代码:
- (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到内存的单元格时
答案 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以获取更好的知识。