在计算UITableViewCell的高度时,如果我能告诉我的UITableViewCell设置为style,它会很有用。我没有看到细胞本身的任何属性。这可能吗?
答案 0 :(得分:6)
不,Apple不公开UITableViewCell的样式属性。但是你有几个选择。
创建自己的UITableViewCell
子类,在调用initWithStyle时将样式保存到属性。
@property UITableViewCellStyle cellStyle;
// ...
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
self.cellStyle = style;
}
return self;
}
手动将样式保存到单元格标记。然后,您可以在设置单元格高度时检查单元格上的标记。例如:
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:nil];
cell.tag = UITableViewCellStyleValue1;
答案 1 :(得分:2)
由于一些奇怪的原因,Apple没有在其公共标题中包含属性,但是您可以简单地调用valueForKey来获取它:
UITableViewCellStyle style = [tableCell valueForKey:@"tableViewStyle"];
如果使用valueForKey关注您,并且您正在使用故事板,则可以进行子类化和覆盖:
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
if (self) {
_cellStyle = [aDecoder decodeIntForKey:@"UITableViewCellStyle"];
}
return self;
}
其他答案显示了如何以编程方式创建单元格。
答案 2 :(得分:0)
是的,你可以。您可以在tableview上访问style
方法以返回当前样式。 Here is a link to apple's documentation.
修改强>
哎呀我刚刚注意到你在询问UITableViewCell。理想情况下,您不需要知道单元格的样式,因为您实际上无法更改现有单元格的样式。您只能使用以下样式初始化单元格:
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:Cellidentifier];
答案 3 :(得分:0)
不直接,或至少不是100%可靠......
执行[cell initWithStyle:style reuseIdentifier:foo]
时,所选样式仅用于(重新)布局单元格的内容,特别是textLabel与detailTextLabel的布局。此后风格不再重要......但是你可以所做的是随后查看最终的布局 - 即textLabel与detailTextLabel框架 - 并从他们的位置&大小原始选择的样式可能是什么[我说'可能'因为如果textLabel或detailTextLabel是nil,那么就说UITableViewCellStyleDefault和UITableViewCellStyleValue1从UITableViewCellStyleSubtitle中区分UITableViewCellStyleDefault,因为你只有一个textLabel并且它们看起来都一样]
那就是说,这样的事情可能足以满足你的需要(在[cell layoutSubviews]
之后):
if (!CGRectGetHeight(cell.detailTextLabel.frame) {
// UITableViewCellStyleDefault, b/c it never shows a detailTextLabel
} elseif (CGRectGetMinY(cell.detailTextLabel.frame) == CGRectGetMinY(cell.textLabel.frame)) {
// UITableViewCellStyleValue1 or UITableViewCellStyleValue2
} else {
// UITableViewCellStyleSubtitle
}
同样,YMMV ......这假设你的textLabel和detailTextLabel 都非零。
顺便说一下你可以通过查看标签的textAlignment来进一步区分UITableViewCellStyleValue1和UITableViewCellStyleValue2,但实际上没有办法知道在单元格是initWithStyle'd之后的某些时候这些都没有以编程方式重新对齐。
说了这么多,如果你想100%可靠地检查你的UITableViewCell初始化的样式,那么你最安全的选择是制作一个简单的子类来覆盖-initWithStyle:reuseIdentifier:
并保存这是一个新的财产;即接受答案的选项1。