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_Uiview_Uitableview - Fatal编程技术网

Ios UITableViewCell在视图生命周期中何时创建其插座/标签/子视图?

Ios UITableViewCell在视图生命周期中何时创建其插座/标签/子视图?,ios,objective-c,uiview,uitableview,Ios,Objective C,Uiview,Uitableview,我正在尝试创建一个UIView作为子类UITableViewCell的子视图。基本上,我想要一个与单元格大小相同的视图,位于单元格的contentView和backgroundView之间 我想象在引擎盖下面的某个地方(可能在layoutSubviews中),在UITableViewCell.m中有一行类似于: if (self.contentView != nil) { [self addSubview:self.contentView]; } 如果我想模仿苹果的做法,我应该把这些代

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

我想象在引擎盖下面的某个地方(可能在
layoutSubviews
中),在
UITableViewCell.m
中有一行类似于:

if (self.contentView != nil) {
    [self addSubview:self.contentView];
}
如果我想模仿苹果的做法,我应该把这些代码放在我自己的自定义
UITableViewCell
子类中的什么地方

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

编辑:以下是我目前的代码:

CustomTableViewCell.h

interface CustomTableViewCell : UITableViewCell
    @property (nonatomic, strong) UIView *newSubview;
@end
CustomTableViewCell.m

- (void)layoutSubviews {
    [super layoutSubviews];

    if (self.newSubview != nil) {
        self.newSubview.autoresizingMask = UIViewAutoresizingFlexibleHeight;
        [self insertSubview:self.newSubview aboveSubview:self.backgroundView];
    }
}
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;

一般来说,对象应该在其指定的初始值设定项中创建其属性,除非有压倒一切的设计原则(或性能/资源问题)要求它们以后创建它们

UIView
(以及OS X上的
NSView
)的指定初始值设定项是
-initWithFrame:
UITableView
的指定初始值设定项是
initWithFrame:style:
。由于视图通常需要在添加到其superview后立即提供其可见子视图,因此可以在指定的初始值设定项中创建并设置它们

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

对于UITableView,每次重新加载表时都会调用
-layoutSubviews

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

-heightforrowatinexpath
方法提供了一个表视图,其中包含了该行单元格所需的空间量,但实际上不会导致调整单元格的大小。创建单元格时必须自己设置单元格的边界(或者,如果单元格被设计为固定值,则可以在
-initWithStyle:reuseIdentifier:
中设置自己的边界)。如果单元格的大小与表格的预期不匹配,则会出现间隙或重叠

要使自动调整遮罩的大小正常工作,必须自己配置视图的初始帧(在代码或nib中)。自动调整视图的大小会影响视图如何响应其父视图边界中的更改,但无助于确定视图的初始帧


具体来说,必须为单元格的子视图设置初始帧(并确保同级子视图排序等)。在NIB中比在代码中更容易做到这一点。

展示您迄今为止所做的尝试,以及您是否设置了自动调整大小规则?尝试设置autoresizemask,似乎没有什么不同。我已经发布了我的代码。谢谢这个话题,但有一件事我知道——来自xib或故事板的自动调整大小的东西真的把事情搞砸了。谢谢你的详细回复。因此,考虑到在为我的CustomTableViewCell指定的初始值设定项中,子视图还不知道,在
布局子视图中使用
[insertSubview:oversubview::
方法可以吗?当然可以。视图层次结构旨在支持动态操作。这就是他们如此精彩的部分原因。您可以随时添加和删除子视图。但是,管理视图层次结构在概念上与管理视图的布局有很大不同。也许有一个更自然的地方可以添加和删除视图,无论您想要添加或删除视图的属性是什么。例如,当子视图的内容发生更改时(在-reloadData中),表视图可能会添加/删除子视图,然后在单独的步骤中进行布局。此外,my
newSubview
的大小不正确,但单元格的
backgroundView
selectedBackgroundView
的大小正确,尽管所有三个都以相同的方式初始化:
initWithFrame:cell.frame
。这表明某些视图在创建后会调整其大小。我是否可以为自己的自定义单元格视图复制此过程?嗯,我可能错误地认为表视图没有更改内容视图的大小。一个人应该经常测试自己的假设!哈哈,这可能是值得进一步调查的事情。最后,我决定在创建可重用单元时手动设置子视图的高度——这是一个不太优雅但仍然可行的解决方案。