在 heightForRowAtIndexPath 中访问自定义单元格属性
Access custom cell properties in heightForRowAtIndexPath
我有一个习惯UITableViewCell
。我想访问单元格属性,即 UILabel
等。我尝试插入以下代码:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
CategorieCell *customCell = (CategorieCell *)[tableView cellForRowAtIndexPath:indexPath];
return ...
}
当我 运行 应用程序时,它崩溃了,但没有提供错误详细信息。问题出在我正在创建的新 customCell 上。还有其他方法可以访问 customCell.m
对象吗?
关于崩溃,请注意您正在使用 cellForRowAtIndexPath: 这是您必须实现的 UITableViewDatasource 中的一个方法,该方法默认调用 heightForRowAtIndexPath,因此它将成为一个递归的
我假设您希望在此方法中使用自定义单元格,以便从中获取高度。
实现此目的的最佳方法是在 CategorieCell 上编写一个 class 方法,它为您提供具有特定数据的单元格的高度。
其他选项是使用代码提取方法,例如获取 uitableviewcell
(CategorieCell*) categorieCellForIndex:(NSIndex)index selected:(BOOL)selected{
...
}
在 heightForRowAtIndexPath
中永远不应称为 cellForRowAtIndexPath
。
第一个在第二个之前调用,如果您需要访问标签(例如计算文本的高度),您通常可以初始化一个单元格。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
static CategorieCell *cell;
if (!cell) {
cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"];
cell.frame = CGRectMake(0, 0, tableView.frame.size.width-tableView.contentInset.left-tableView.contentInset.right, cell.frame.size.height);
[cell layoutIfNeeded];
}
cell.label.text = myDatasourceText;
CGFloat cellHeight = ....
return cellHeight;
}
注 1:
我使用 dequeueReusableCellWithIdentifier
假设你正在使用 Interface Builder,否则你需要使用 alloc] initWithStyle:...]
;
注2:
如您所见,我正在设置单元格的框架。这是必需的,否则您的单元格将默认为 (320 x 44)
。你可能在 iPhone 6/6+ (i.e. screen width: 414)
或 iPad
中,你可能需要根据他的宽度和他的文本来计算标签的高度,因此你需要设置标签的框架细胞.
注 3:
我假设你有一组相同的单元格结构,因此我使用了一个 static
单元格,所以它将 重用 而不会分配其他无用的单元格。
尝试像这样注册您的自定义单元 class:
[self.tableView registerClass:[CategorieCell class] forCellReuseIdentifier:NSStringFromClass([CategorieCell class]);
然后在 -tableView:heightForRowAtIndexPath:
中执行如下操作:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
CategorieCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([CategorieCell class)];
}
我有一个习惯UITableViewCell
。我想访问单元格属性,即 UILabel
等。我尝试插入以下代码:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
CategorieCell *customCell = (CategorieCell *)[tableView cellForRowAtIndexPath:indexPath];
return ...
}
当我 运行 应用程序时,它崩溃了,但没有提供错误详细信息。问题出在我正在创建的新 customCell 上。还有其他方法可以访问 customCell.m
对象吗?
关于崩溃,请注意您正在使用 cellForRowAtIndexPath: 这是您必须实现的 UITableViewDatasource 中的一个方法,该方法默认调用 heightForRowAtIndexPath,因此它将成为一个递归的
我假设您希望在此方法中使用自定义单元格,以便从中获取高度。 实现此目的的最佳方法是在 CategorieCell 上编写一个 class 方法,它为您提供具有特定数据的单元格的高度。
其他选项是使用代码提取方法,例如获取 uitableviewcell
(CategorieCell*) categorieCellForIndex:(NSIndex)index selected:(BOOL)selected{
...
}
在 heightForRowAtIndexPath
中永远不应称为 cellForRowAtIndexPath
。
第一个在第二个之前调用,如果您需要访问标签(例如计算文本的高度),您通常可以初始化一个单元格。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
static CategorieCell *cell;
if (!cell) {
cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"];
cell.frame = CGRectMake(0, 0, tableView.frame.size.width-tableView.contentInset.left-tableView.contentInset.right, cell.frame.size.height);
[cell layoutIfNeeded];
}
cell.label.text = myDatasourceText;
CGFloat cellHeight = ....
return cellHeight;
}
注 1:
我使用 dequeueReusableCellWithIdentifier
假设你正在使用 Interface Builder,否则你需要使用 alloc] initWithStyle:...]
;
注2:
如您所见,我正在设置单元格的框架。这是必需的,否则您的单元格将默认为 (320 x 44)
。你可能在 iPhone 6/6+ (i.e. screen width: 414)
或 iPad
中,你可能需要根据他的宽度和他的文本来计算标签的高度,因此你需要设置标签的框架细胞.
注 3:
我假设你有一组相同的单元格结构,因此我使用了一个 static
单元格,所以它将 重用 而不会分配其他无用的单元格。
尝试像这样注册您的自定义单元 class:
[self.tableView registerClass:[CategorieCell class] forCellReuseIdentifier:NSStringFromClass([CategorieCell class]);
然后在 -tableView:heightForRowAtIndexPath:
中执行如下操作:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
CategorieCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([CategorieCell class)];
}