我正在创建一个显示数据库中用户搜索结果的tableview。
当我执行搜索时,将填充数据源并将用户添加到:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
对于创建的每个单元格,都会创建一个关联的个人资料照片和按钮,并将其添加到当前单元格中。
我有一个方法,我只是用于测试,它清除数据源并重新加载所有单元格
- (IBAction)cleardaTables:(id)sender {
[_dataSource removeAllObjects];
[self.tableView reloadData];
}
如果我使用该按钮清除搜索,并搜索其他内容,或显示一个占位符单元格,其中显示"搜索用户,"我的占位符单元格仍会显示其前一个单元格中的一个按钮。
任何人都知道如何真正清除细胞数据并展示新鲜细胞吗?
代码 - 抱歉凌乱
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *searchResultCell = @"searchResultCell";
EIConnectionsGlobalSearchResultCell *cell = [tableView dequeueReusableCellWithIdentifier:searchResultCell];
if (cell == nil) {
cell = [[EIConnectionsGlobalSearchResultCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:searchResultCell];
}
//Create "no results" cell if datasource is empty after search
if (_emptySearch == 1)
{
cell.imageView.image = nil;
cell.labelName.text = @"No results...";
cell.labelConnectionStatus.text = @"Try another search.";
cell.labelConnectionStatus.textColor = [UIColor grayColor];
[cell setUserInteractionEnabled:NO];
return cell;
}
else if (_emptySearch == 0)
{
//Assigning Search Result
NSMutableDictionary *searchResult = [_dataSource objectAtIndex:indexPath.row];
//Text Configs
cell.labelName.text = [searchResult objectForKey:@"Name"];
//Assign and Convert ConnectionStatus Number to string and color
int connectionStatusInt = [[searchResult objectForKey:@"ConnectionStatus"] intValue];
NSMutableArray *connectionStatus = [self connectionStatusToString:connectionStatusInt withIndexPath:indexPath];
cell.labelConnectionStatus.text = connectionStatus[0];
cell.labelConnectionStatus.textColor = connectionStatus[1];
//Setting up profile photo for cell
if ([[searchResult objectForKey:@"picDownloaded"] isEqualToString:@"no"] || ![searchResult objectForKey:@"picDownloaded"]) {
if (self.tableView.dragging == NO && self.tableView.decelerating == NO)
{
[self startProfilePicDownload:searchResult andIndex:indexPath];
}
//Setting Default Image while downloading
cell.imageView.image = defaultProfileImage;
}
else
{
//A profile pic exists in cache, so assign it to the view
cell.imageView.image = [searchResult objectForKey:@"profilePic"];
}
//setting up cell actions
UIButton *cellAction = [UIButton buttonWithType:UIButtonTypeCustom];
cellAction.frame = CGRectMake(cell.frame.size.width - 52, 18.0f, 25.0f, 25.0f);
UIImage *buttonImage = [UIImage imageNamed:@"Arrow-Icon"];
[cellAction setImage:buttonImage forState:UIControlStateNormal];
cellAction.imageView.contentMode = UIViewContentModeScaleAspectFit;
[cellAction setTag:indexPath.row];
[cellAction addTarget:self action:@selector(showCellActionOptions:) forControlEvents:UIControlEventTouchUpInside];
[cell addSubview:cellAction];
return cell;
}
return cell;
}
答案 0 :(得分:1)
细胞被重复使用。这是在滚动表视图以及重新加载时发生的。
您遇到的一个大问题是,当UIButton
等于0时,每次重复使用时,都会向单元格添加另一个_emptySearch
。但同样的单元格也可以在其他条件下重复使用。 / p>
你有几个选择。
_emptySearch
等于0时所需的行,另一个用于等于1时的行。在这种情况下,请在IB中添加按钮,而不是在cellForRowAtIndexPath
中添加按钮。另请参阅UITableViewCell prepareForReuse
方法。您应该实现此方法(并调用super prepareForReuse
)以根据需要重置单元格标签和图像。