Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我是否可以通过编程方式检查UITableViewCell是什么样式?_Ios_Objective C_Uitableview - Fatal编程技术网

Ios 我是否可以通过编程方式检查UITableViewCell是什么样式?

Ios 我是否可以通过编程方式检查UITableViewCell是什么样式?,ios,objective-c,uitableview,Ios,Objective C,Uitableview,在计算UITableViewCell的高度时,如果我能够知道我的UITableViewCell设置为什么,这将非常有用。我没有看到单元格本身的任何属性。这可能吗?是的,你可以。您可以访问tableview上的style方法以返回当前样式 编辑: 哎呀,我刚注意到你在问一个UITableViewCell。理想情况下,您不需要知道单元格的样式,因为您实际上无法更改现有单元格的样式。只能使用以下样式初始化单元格: cell = [[UITableViewCell alloc] initWithStyl

在计算UITableViewCell的高度时,如果我能够知道我的UITableViewCell设置为什么,这将非常有用。我没有看到单元格本身的任何属性。这可能吗?

是的,你可以。您可以访问tableview上的
style
方法以返回当前样式

编辑:

哎呀,我刚注意到你在问一个UITableViewCell。理想情况下,您不需要知道单元格的样式,因为您实际上无法更改现有单元格的样式。只能使用以下样式初始化单元格:

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:Cellidentifier];

否,Apple不公开UITableViewCell的style属性。但你有两个选择

  • 创建自己的
    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;
    

  • 不是直接的,或者至少不是100%可靠的

    执行
    [cell initWithStyle:style reuseIdentifier:foo]
    时,所选样式仅用于(重新)布局单元格内容,特别是textLabel与detailTextLabel的布局。此后,风格不再真正重要。。。但是,您可以做的是随后查看生成的布局-即textLabel与detailTextLabel框架-并从它们的位置和大小推断原始选择的样式可能是什么[我之所以说“可能”,是因为如果textLabel或detailTextLabel为零,那么实际上无法区分UITableViewCellStyleDefault、UITableViewCellStyleValue1和UITableViewCellStyleSubtitle,因为你只有一个textLabel,它们看起来都一样]

    也就是说,这样的东西可能满足您的需要(在
    [cell layoutSubviews]
    之后,即):

    同样,YMMV…这假设您的textLabel和detailTextLabel都是非零的

    顺便说一句,通过查看标签的textAlignment,您可以进一步区分UITableViewCellStyleValue1和UITableViewCellStyleValue2,但实际上无法知道这些标签在单元格初始化为Style后的某个时间没有以编程方式重新对齐


    话虽如此,如果你想在UITableViewCell被初始化为什么样式后100%可靠地检查,那么你最安全的办法就是创建一个简单的子类,它覆盖
    -initWithStyle:reuseIdentifier:
    ,并将其保存在一个新属性中;即接受答案的选项1。

    出于某种奇怪的原因,苹果没有包括它属性的公共标头中的属性,但您只需调用valueForKey即可获取该属性:

    UITableViewCellStyle style = [tableCell valueForKey:@"tableViewStyle"];
    
    如果使用valueForKey与您有关,并且您使用的是故事板,那么您可以子类化并覆盖:

    - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder{
        self = [super initWithCoder:aDecoder];
        if (self) {
            _cellStyle = [aDecoder decodeIntForKey:@"UITableViewCellStyle"];
        }
        return self;
    }
    

    其他答案显示了如何为编程创建的单元格获取它。

    Chase,我在寻找单元格的样式,而不是表格的样式。我会在我的问题中添加更多信息以使这一点更清楚。嗯。这是我害怕的,但如果我想实现HeightForRowatineXpath,并且我想根据单元格类型做一些不同的事情,该怎么办?+1.第一个选项是我要做的。子类化不仅允许您保存和访问问题中的信息,还可以非常轻松地保存和访问与每个单元格关联的任何其他内容。
    - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder{
        self = [super initWithCoder:aDecoder];
        if (self) {
            _cellStyle = [aDecoder decodeIntForKey:@"UITableViewCellStyle"];
        }
        return self;
    }