我可以以编程方式检查UITableViewCell的样式吗?

时间:2015-03-03 18:10:31

标签: ios objective-c uitableview

在计算UITableViewCell的高度时,如果我能告诉我的UITableViewCell设置为style,它会很有用。我没有看到细胞本身的任何属性。这可能吗?

4 个答案:

答案 0 :(得分:6)

不,Apple不公开UITableViewCell的样式属性。但是你有几个选择。

  1. 创建自己的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;
    }
    
  2. 手动将样式保存到单元格标记。然后,您可以在设置单元格高度时检查单元格上的标记。例如:

    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。