gpt4 book ai didi

ios - 将 subview 添加到 cell.contentView

转载 作者:行者123 更新时间:2023-12-01 19:05:35 24 4
gpt4 key购买 nike

- (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

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

编辑:

其他代码片段:
- (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];

}

最佳答案

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

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

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

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

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

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

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

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

关于ios - 将 subview 添加到 cell.contentView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19873503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com