1
- (UITableViewCell *)cellForInfoWithCellIdentifier:(NSString *)cellIdentifier
                                      forIndexPath:(NSIndexPath *)indexPath
                                       inTableView:(UITableView *) tableView
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

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

    NSLog(@"%d", cell.contentView.subviews.count);
    if (cell.contentView.subviews.count > 0)
    {
        [cell.contentView.subviews[0] removeFromSuperview];
    }

    [cell.contentView addSubview:self.viewsForOptions[self.selectedIndex]];
    NSLog(@"%d", cell.contentView.subviews.count);

    return cell;
}

上面的代码是为特定的部分和行调用的cellForRowAtIndexPath。每当更改分段控制对象的值时,都会更改此单元格。

方法如下:

- (void)testOptionsValueChanged:(id)sender
{
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:1];
    [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}

我只有两个细胞;1 在每个部分中,因此cell == nil条件始终为false

问题:

当 tableView 加载控制台日志时:

0
1

当我更改分段控件的值时,我仍然得到:

0
1

经过更多尝试,我基本上使第二个视图(对于第二个索引)的高度增加了。我似乎不知道为什么会发生这种情况。

编辑:

其他代码片段:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 0)
    {
        // test detail view is a constant height
        if (indexPath.row == 0)
            return 180.0;
    }
    else if (indexPath.section == 1)
    {
        // based on the view loaded from the viewForOptions array
        if (indexPath.row == 0)
        {
            return ((UIView *)self.viewsForOptions[self.selectedIndex]).frame.size.height;
        }
    }

    return 0;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *DetailCellIdentifier = @"DetailCell";
    static NSString *InfoCellIdentifier = @"InfoCell";

    UITableViewCell *cell;

    if (indexPath.section == 0)
    {
        // displays views and test button
        if (indexPath.row == 0)
        {
            cell = [self cellForTestDetailWithCellIdentifier:DetailCellIdentifier forIndexPath:indexPath inTableView:tableView];
        }
    }
    else if (indexPath.section == 1)
    {
        // display the view for information based on segmented control
        if (indexPath.row == 0)
        {
            cell = [self cellForInfoWithCellIdentifier:InfoCellIdentifier forIndexPath:indexPath inTableView:tableView];
        }
    }

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    return cell;
}

- (void)viewDidLoad
{
    // set the selected index for the options segmented control
    self.selectedIndex = 0;

    // instantiate all the views for test segmented control options
    self.aViewController = [[AViewController alloc] ...];
    self.bViewController = [[BViewController alloc] ...];
    self.cViewController = [[CViewController alloc] ...];

    // add all the views to an array that will be used by the tableview
    self.viewsForOptions = @[self.aViewController, self.bViewController, self.cViewController];

}
4

1 回答 1

3

您的0,1to1,1是由表视图重用机制引起的。基本上,表格不会重用任何已经在使用的单元格。因此,当您第一次填充并第一次刷新表格时,将创建新的单元格。之后,重用队列中有足够的单元格未被使用,因此不需要创建新的单元格(滚动可能会创建更多单元格)。

您的高度问题可能是由自动调整大小/布局引起的。当您添加子视图时,您应该指定它应该是什么大小,以及随着父视图(单元格)大小的更改,该大小应该如何更改。并且单元格大小已更改(添加子视图时记录它)。


单元格的高度是其中的一部分。通常你会想要设置:

UIView *subview = self.viewsForOptions[self.selectedIndex];
subview.frame = cell.contentView.bounds;
[cell.contentView addSubview:subview];

这样当单元格调整大小时,子视图将具有正确的大小。但这取决于您的自动调整大小规则。如果您设置布局约束来固定高度和宽度,那么您不需要设置框架。

无论哪种情况,您都需要指定当父视图框架发生变化时子视图框架会发生什么。


我想,您的问题是单元格在被重用之前已调整大小,并且您的子视图仍处于附加状态。因此,它也会调整大小。然后,在heightForRowAtIndexPath:您使用子视图的高度(现在无效,尝试记录它)来设置行的高度。

我会考虑更改实现heightForRowAtIndexPath:以使用基于所选段而不是子视图框架高度的配置。

于 2013-11-09T09:41:15.727 回答