我创建了一个UiTableView
并设置了UIButton
及其标题。由于数据来自Web服务=我在cellForRowAtIndexPath
方法中执行此操作。 Tableview
使用可重复使用的细胞,因为细胞通常会长到100或更多。所以它是一个记忆的东西。
这就是我的cellForRowAtIndexPath
方法:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
cell.item = self.dataArray[indexPath.row];
/* Add a button to the cell - for user name */
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[myButton addTarget:self
action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
/* Setup the button */
myButton.frame = CGRectMake(214, 5, 93, 21);
[myButton setTitle:cell.item.userName forState:UIControlStateNormal];
[cell.contentView addSubview:myButton];
return cell;
}
问题
这很好用。但是,当我开始滚动时,myButton
的标签会显示多个值,看起来我已经在一个按钮上添加了多个标题。我怀疑原因是由于细胞重复使用。 "新"进入视野的细胞仍然具有“#34; old"小区myButton
的标题。
问题
如何在不恢复不可重复使用的细胞的情况下避免这种情况?
答案 0 :(得分:1)
您没有为按钮添加多个标题,实际上您添加了多个按钮。随着
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
您创建了一个全新的按钮并使用
[cell.contentView addSubview:sellerButton];
您将其作为子视图添加到单元格中。第一次创建单元格时,它只有一个按钮。但是当重复使用该单元时,它已经有一个按钮(或多个),另一个按钮被添加到顶部。当按钮的背景是透明的时,它看起来像一个带有多个标题的按钮。
解决此问题的一种方法是检查单元格是否已按钮,在这种情况下只更改按钮的标题(例如,使用其他回复中建议的标签) )。
更好的方法是在自定义单元格的初始化方法中添加按钮,在自定义单元格的类中为按钮创建属性,在-tableView:cellForRowAtIndexPath:
中只更改按钮的标题。
在MyCustomCell.h中:
@property (strong, nonatomic) UIButton *sellerButton;
在MyCustomCell.m中:
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
/* Add a button to the cell - for user name */
self.sellerButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[self.sellerButton addTarget:self
action:@selector(buttonPressed:)
forControlEvents:UIControlEventTouchUpInside];
/* Setup the button */
self.sellerButton.frame = CGRectMake(214, 5, 93, 21);
[self.sellerButton setTitle:self.item.userName forState:UIControlStateNormal];
[self.contentView addSubview:self.sellerButton];
}
return self;
}
在您的表格中查看控制器的.m文件:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
cell.item = self.dataArray[indexPath.row];
[cell.sellerButton setTitle:cell.item.userName forState:UIControlStateNormal];
return cell;
}
在我看来,这比使用标签在单元格的视图层次中识别按钮更简洁,因为您将单元格的布局配置(不会发生变化)与它呈现的数据(按钮标题)。
答案 1 :(得分:1)
这样的事情可以帮助您防止重复UIButton
个对象
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
cell.item = self.dataArray[indexPath.row];
UIButton *myButton = (UIButton *)[cell.contentView viewWithTag:100];
if (myButton) {
//button already present
NSLog(@"Button already present");
}
else {
//button not present
myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[myButton setTag:100]; //needed for this logic to work
[myButton setFrame:CGRectMake(214, 5, 93, 21)];
[myButton addTarget:self
action:@selector(buttonPressed:)
forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:myButton];
}
[myButton setTitle:cell.item.userName forState:UIControlStateNormal];
return cell;
}