在视图生命周期中,UITableViewCell是否创建了其outlet/labels/subviews?

Awa*_*ain 4 objective-c uitableview uiview ios

我正在尝试创建UIView一个子类的子视图UITableViewCell.基本上我想要一个与单元格大小相同的视图,并且位于单元格contentView和单元格之间backgroundView.

我想在引擎盖下的某个地方(可能在layoutSubviews),有一条线,UITableViewCell.m如:

if (self.contentView != nil) {
    [self addSubview:self.contentView];
}
Run Code Online (Sandbox Code Playgroud)

如果我想模仿Apple的方式,我应该把这些代码放在我自己的自定义UITableViewCell子类中?

此外,在我第一次尝试实现时,会显示子视图,但它的默认单元格高度为44px,而不是我指定的高度tableView:heightForRowAtIndexPath:.还有其他小错误出现,这就是为什么我想尝试复制Apple的实现,而不是尝试我自己的半功能.

编辑:这是我的代码到目前为止:

CustomTableViewCell.h

interface CustomTableViewCell : UITableViewCell
    @property (nonatomic, strong) UIView *newSubview;
@end
Run Code Online (Sandbox Code Playgroud)

CustomTableViewCell.m

- (void)layoutSubviews {
    [super layoutSubviews];

    if (self.newSubview != nil) {
        self.newSubview.autoresizingMask = UIViewAutoresizingFlexibleHeight;
        [self insertSubview:self.newSubview aboveSubview:self.backgroundView];
    }
}
Run Code Online (Sandbox Code Playgroud)

tableViewController.m

static NSString *CellIdentifier = @"Cell";
myCustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

UIView *view = [[UIView alloc] initWithFrame:cell.frame];
view.backgroundColor = [UIColor orangeColor];
cell.newSubview = view;
Run Code Online (Sandbox Code Playgroud)

Bor*_*aut 6

一般来说,对象应该在其指定的初始化程序中创建它们的属性,除非有一个重要的设计原则(或性能/资源问题),要求它们以后创建它们.

UIView(和NSViewOS X)的指定初始化程序是-initWithFrame:.指定的初始化程序UITableViewinitWithFrame:style:.由于视图通常需要在添加到超级视图后立即使其可见的子视图可用,因此可以在指定的初始化程序中创建和设置它们.

-layoutSubviews用于更新布局,即中心,边界(或框架)和(可选)变换.现在,因为消息的排序.您不希望创建子视图,-layoutSubviews因为该方法在视图的生命周期内被重复调用,因为其父视图的边界已更改,并且在其父视图中被删除或重新添加,或者其子视图发生更改.

在UITableView的情况下,-layoutSubviews每次重新加载表时都会调用它.

此规则的一个典型例外是创建UITableViewCell用作表的行的s,必须动态创建.

-heightForRowAtIndexPath方法提供了一个表视图,其中包含了该行的单元格所需的空间量,但实际上并未导致单元格的大小调整.你必须在创建单元格时自己设置单元格的边界(或者单元格可以设置自己的边界-initWithStyle:reuseIdentifier:,如果它被设计为固定值).如果您的单元格大小与表格的预期不符,您将获得间隙或重叠.

要自动调整掩码以使其正常工作,您必须自己配置视图的初始帧(在代码中或在nib中).自动调整视图会影响它如何响应其父视图边界的更改,但无法帮助确定视图的初始帧.

具体而言,您必须为单元格的子视图设置初始帧(并确保同级子视图排序等).这在笔尖中比在代码中更容易.