Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.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
Iphone 自定义单元格,只有最后一个单元格获取[LayoutSubView]?_Iphone_Ios_Objective C_Ios6_Uitableview - Fatal编程技术网

Iphone 自定义单元格,只有最后一个单元格获取[LayoutSubView]?

Iphone 自定义单元格,只有最后一个单元格获取[LayoutSubView]?,iphone,ios,objective-c,ios6,uitableview,Iphone,Ios,Objective C,Ios6,Uitableview,我正在为我的应用程序创建一个设置视图,该视图中有一个UITableView。我正在创建自定义单元格以满足我的需要,但我遇到了问题-只有最后一个单元格获得了[layoutSubviews]。我做错什么了吗 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //int type = (indexPath.row == 0?1:0);

我正在为我的应用程序创建一个设置视图,该视图中有一个UITableView。我正在创建自定义单元格以满足我的需要,但我遇到了问题-只有最后一个单元格获得了
[layoutSubviews]
。我做错什么了吗

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    //int type = (indexPath.row == 0?1:0);
    //if(indexPath.row == 6) type = 2;

    NSLog(@"row %i created", indexPath.row);
    TableCell *cell = [[TableCell alloc] initWithType:indexPath.row];

    cell.textLabel.text = @"Test cell";

    return cell;
}
在我的自定义单元格中:

@implementation TableCell

UIImageView *shadowView;
int row;

- (id) initWithType:(int)type {
    row = type;

    self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

    self.backgroundColor = [UIColor clearColor];
    self.backgroundView = [[UIView alloc] init];

    UIImage *shadowImage = [UIImage imageNamed:@"CellShadow"];
    shadowImage = [shadowImage resizableImageWithCapInsets:UIEdgeInsetsMake(14, 14, 14, 14)];

    shadowView = [[UIImageView alloc] initWithImage:shadowImage];

    [self.contentView addSubview:shadowView];
    //[self.contentView sendSubviewToBack:shadowView];

    NSLog(@"agreed, row %i created", row);

    [self layoutSubviews];

    return self;
}

- (void) layoutSubviews {
    NSLog(@"row: %i", row);

    [super layoutSubviews];

    shadowView.frame = CGRectMake(
        0, 0,
        self.contentView.frame.size.width,
        self.contentView.frame.size.height
    );
}

@end

连续地,当我旋转或应调用LayoutSubview时,仅报告最后一个单元格#6。有什么建议吗?

不要直接调用
layoutSubviews
。使用
[self-setNeedsLayout]
[self-layoutifneed]
。但是不要在计算单元的init方法中调用这些函数

另外,不要调用[[TableCell alloc]initWithType:indexPath.row];直接的。相反,使用

-(id)dequeueReusableCellWithIdentifier:(NSString*)indexPath的标识符:(NSIndexPath*)indexPath

一旦您构建了该单元格,您可以告诉它它是行,但是请注意,当表格滚动时,单元格会被回收,因此您必须在每次调用
cellforrowatinexpath
时更新该值

调整表视图的大小时,单元格应该重新获得布局(无需直接或间接调用)


请参阅。

不要直接调用
布局子视图。使用
[self-setNeedsLayout]
[self-layoutifneed]
。但是不要在计算单元的init方法中调用这些函数

另外,不要调用[[TableCell alloc]initWithType:indexPath.row];直接的。相反,使用

-(id)dequeueReusableCellWithIdentifier:(NSString*)indexPath的标识符:(NSIndexPath*)indexPath

一旦您构建了该单元格,您可以告诉它它是行,但是请注意,当表格滚动时,单元格会被回收,因此您必须在每次调用
cellforrowatinexpath
时更新该值

调整表视图的大小时,单元格应该重新获得布局(无需直接或间接调用)


请参阅。

您不应直接调用
布局子视图,一旦单元格准备好显示,iOS将自动调用它。您还应该按照@danh的建议对单元格进行去噪。如果您对所有这些都不太满意,那么我真的建议您看看免费的Sensive TableView框架,它可以自动创建此类设置视图(我在几行中创建了我的设置视图)。

您不应该直接调用
LayoutSubView
,一旦单元格准备好显示,iOS将自动调用它。您还应该按照@danh的建议对单元格进行去噪。如果您对所有这些都不太满意,那么我真的建议您看看免费的Sensive TableView框架,它可以自动创建这些设置视图(我在几行中创建了我的设置视图)。

问题在于我自己的代码太差。使用cell.backgroundView有很大帮助。

问题是我自己的代码太差。使用cell.backgroundView在这里帮助很大。

不要自己调用布局子视图。当单元中的子视图的任何帧发生更改时,将调用它。即使只是更改自定义单元格中标签的文本,也不会调用LayoutSubview。利用单元的特性进行重用以获得更好的性能。因为它不会每次都分配单元。在您的代码中,似乎有很多内存问题,因为分配的单元不会被释放,新的单元被创建

不要自己调用布局子视图。当单元中的子视图的任何帧发生更改时,将调用它。即使只是更改自定义单元格中标签的文本,也不会调用LayoutSubview。利用单元的特性进行重用以获得更好的性能。因为它不会每次都分配单元。在您的代码中,似乎有很多内存问题,因为分配的单元不会被释放,新的单元被创建

谢谢你的详细回答。但是,即使使用[self-setNeedsLayout]而不是直接调用layoutSubviews,当视图旋转时,只有最后一行获得layoutSubviews。我应该更仔细地阅读您的代码。(布局子视图错误引起了我的注意。这些子视图肯定应该删除)。我已经编辑了答案。首先正确构建单元,布局应该可以正常工作。如果没有,请尝试在旋转时重新加载tableView数据,但您不需要它。我不使用可重用的单元格,因为这将是一个设置视图,并且只有少量单元格。不管怎样,它似乎都不起作用。谢谢你的详细回答。但是,即使使用[self-setNeedsLayout]而不是直接调用layoutSubviews,当视图旋转时,只有最后一行获得layoutSubviews。我应该更仔细地阅读您的代码。(布局子视图错误引起了我的注意。这些子视图肯定应该删除)。我已经编辑了答案。首先正确构建单元,布局应该可以正常工作。如果没有,请尝试在旋转时重新加载tableView数据,但您不需要它。我不使用可重用的单元格,因为这将是一个设置视图,并且只有少量单元格。是的,我做了很多改变,允许分配和重用,并且解决了这个问题。谢谢你的留言!是的,我做了很多更改,允许分配和重用,并解决了这个问题。谢谢你的留言!