在使用UITableView的正常情况下,我有重用旧单元格的标准代码:
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"Cell";
UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
return cell;
}
然而,我注意到,当我向单元格添加子视图时,他们没有被删除,并且每次都添加了新视图。我在下面有一个例子,它完美地展示了它:
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"Cell";
UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
UILabel *label = [[UILabel alloc] init];
label.text = @"HELLO";
label.frame = CGRectMake(arc4random() % 50, -1, 286, 45);
label.backgroundColor = [UIColor clearColor];
// Add views
[cell addSubview:label];
return cell;
}
我需要一些代码重新使用我的标签,就像重复使用单元格一样。我该怎么办?
由于
答案 0 :(得分:4)
如果要制作新单元格,则只能添加子视图。如果您要出列,则子视图已存在且不应重新创建。
你的方法应该是:
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"Cell";
UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:cellIdentifier];
UILabel *label;
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
label = [[UILabel alloc] init];
label.tag = 1;
// Add views
[cell addSubview:label];
}
else
{
// Label will already exist, get a pointer to it
label = [cell viewWithTag:1];
}
// Now set properties on the subview that are unique to each cell
label.text = @"HELLO";
label.frame = CGRectMake(arc4random() % 50, -1, 286, 45);
label.backgroundColor = [UIColor clearColor];
return cell;
}
注意标签仅在单元格为零时创建。否则,使用标签找到它。
答案 1 :(得分:0)
您可以使用 else
部分中的内容 if(cell == nil)
for (UIView *sub in [cell.contentView subviews])
{
if([UILabel class] == [sub class])
NSLog(@"%@",[sub class]);
UILabel *label = (UILabel *)sub;
//do label coding ie set text etc.
}
答案 2 :(得分:0)
我需要一些能够以与细胞相同的方式重新使用我的标签的代码 正在被重用。
不,您需要更好地了解表格视图设计。很明显为什么多次添加视图 - 重用一个单元意味着你需要一个不再需要的UITableViewCell
的前一个实例(从而节省了昂贵的新对象分配)并重用了这个实例。新细胞。但是之前的实例已经附加了标签,因此标签数量会增加。
我会继承UITableViewCell
并将标签创建放在这个新类的初始化代码中。 (或者创建一个UIView
子类并将其设置为单元格contentView
,如此nice table tutorial by Matt Gallagher中所示。)这是封装视图详细信息并将其隐藏在表数据源中的正确方法
答案 3 :(得分:0)
我在自定义表格单元格类中使用了视图的延迟初始化。 它只需要加载视图和“addSubview”一次。
- (void) lazyInitTitleLabel {
if (_titleLabel != nil) {
return;
}
_titleLabel = [[UILabel alloc] initWithFrame: CGRectMake(10.0f, 10.0f, 200.0f, 30.0f)];
// Cell adds the label as a subview...
[self addSubview: _titleLabel];
}
您唯一需要注意的是重置视图中显示的内容,例如图片视图中的标签和图片中的文字。如果您没有旧的内容可能会与循环使用的表格单元一起重复使用。
祝你好运!