Iphone 重用UITableViewCell';s
我有一个UITableView,当用户滚动时,它会重复使用单元格。所有内容都显示并滚动良好,但当用户单击实际行时,高亮显示的单元格将显示另一个单元格中的某些文本。我不太清楚为什么Iphone 重用UITableViewCell';s,iphone,objective-c,cocoa-touch,uitableview,Iphone,Objective C,Cocoa Touch,Uitableview,我有一个UITableView,当用户滚动时,它会重复使用单元格。所有内容都显示并滚动良好,但当用户单击实际行时,高亮显示的单元格将显示另一个单元格中的某些文本。我不太清楚为什么 #define IMAGE_TAG 1111 #define LOGIN_TAG 2222 #define FULL_NAME_TAG 3333 // Customize the appearance of table view cells. - (UITableViewCell *)tableView:(UITab
#define IMAGE_TAG 1111
#define LOGIN_TAG 2222
#define FULL_NAME_TAG 3333
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
STUser *mySTUser = [[[STUser alloc]init]autorelease];
mySTUser = [items objectAtIndex:indexPath.row];
AsyncImageView* asyncImage = nil;
UILabel* loginLabel = nil;
UILabel* fullNameLabel = nil;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}
else {
asyncImage = (AsyncImageView *) [cell.contentView viewWithTag:IMAGE_TAG];
loginLabel = (UILabel *) [cell.contentView viewWithTag:LOGIN_TAG];
fullNameLabel = (UILabel *) [cell.contentView viewWithTag:FULL_NAME_TAG];
}
// Configure the cell...
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
CGRect frame = CGRectMake(0, 0, 44, 44);
asyncImage = [[[AsyncImageView alloc]initWithFrame:frame] autorelease];
asyncImage.tag = IMAGE_TAG;
NSURL* url = [NSURL URLWithString:mySTUser.avatar_url_large];
[asyncImage loadImageFromURL:url];
[cell.contentView addSubview:asyncImage];
loginLabel.tag = LOGIN_TAG;
CGRect loginLabelFrame = CGRectMake(60, 0, 200, 10);
loginLabel = [[[UILabel alloc] initWithFrame:loginLabelFrame] autorelease];
loginLabel.text = [NSString stringWithFormat:@"%@",mySTUser.login];
[cell.contentView addSubview:loginLabel];
fullNameLabel.tag = FULL_NAME_TAG;
CGRect fullNameLabelFrame = CGRectMake(60, 20, 200, 10);
fullNameLabel = [[[UILabel alloc] initWithFrame:fullNameLabelFrame] autorelease];
fullNameLabel.text = [NSString stringWithFormat:@"%@ %@",mySTUser.first_name, mySTUser.last_name]; //[NSString stringWithFormat:@"%@",mySTUser.login];
[cell.contentView addSubview:fullNameLabel];
return cell;
}
如果单元格不是nil,则首先从单元格中指定image和labels变量,然后重新初始化它们。对吗?如果单元格不是nil,则首先从单元格中指定图像和标签变量,然后重新初始化它们。对吗?此行分配一个对象,然后丢弃它。不要分配您将不使用的项目
STUser *mySTUser = [[[STUser alloc]init]autorelease];
mySTUser = [items objectAtIndex:indexPath.row];
相反,只需声明一个变量并使用它
STUser *mySTUser;
mySTUser = [items objectAtIndex:indexPath.row];
此行创建一个新对象并将其指定给单元,但每次使用单元时都会发生
asyncImage = [[[AsyncImageView alloc]initWithFrame:frame] autorelease];
[cell.contentView addSubview:asyncImage];
相反,将所有addSubview行置于创建单元格的if条件下
if (cell == nil) {
CGRect frame = CGRectMake(0, 0, 44, 44);
CGRect loginLabelFrame = CGRectMake(60, 0, 200, 10);
CGRect fullNameLabelFrame = CGRectMake(60, 20, 200, 10);
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
asyncImage = [[[AsyncImageView alloc]initWithFrame:frame] autorelease];
[cell.contentView addSubview:asyncImage];
loginLabel = [[[UILabel alloc] initWithFrame:loginLabelFrame] autorelease];
[cell.contentView addSubview:loginLabel];
fullNameLabel = [[[UILabel alloc] initWithFrame:fullNameLabelFrame] autorelease];
[cell.contentView addSubview:fullNameLabel];
asyncImage.tag = IMAGE_TAG;
loginLabel.tag = LOGIN_TAG;
fullNameLabel.tag = FULL_NAME_TAG;
} else ...
if块之外应该发生的唯一事情是分配给每个单元格更改的属性,如[asyncImage loadImageFromURL:url]代码>并将文本指定给标签
此行将一个属性分配给可能为零的对象,然后分配该对象
loginLabel.tag = LOGIN_TAG;
loginLabel = [[[UILabel alloc] initWithFrame:loginLabelFrame] autorelease];
loginLabel = [[[UILabel alloc] initWithFrame:loginLabelFrame] autorelease];
loginLabel.tag = LOGIN_TAG;
而是在创建对象后指定属性
loginLabel.tag = LOGIN_TAG;
loginLabel = [[[UILabel alloc] initWithFrame:loginLabelFrame] autorelease];
loginLabel = [[[UILabel alloc] initWithFrame:loginLabelFrame] autorelease];
loginLabel.tag = LOGIN_TAG;
这一行使用了一个格式化的字符串,其中一个简单的赋值就可以了
loginLabel.text = [NSString stringWithFormat:@"%@",mySTUser.login];
相反,假设mySTUser.login,只需直接分配它
loginLabel.text = mySTUser.login;
此行分配一个对象,然后丢弃它。不要分配您将不使用的项目
STUser *mySTUser = [[[STUser alloc]init]autorelease];
mySTUser = [items objectAtIndex:indexPath.row];
相反,只需声明一个变量并使用它
STUser *mySTUser;
mySTUser = [items objectAtIndex:indexPath.row];
此行创建一个新对象并将其指定给单元,但每次使用单元时都会发生
asyncImage = [[[AsyncImageView alloc]initWithFrame:frame] autorelease];
[cell.contentView addSubview:asyncImage];
相反,将所有addSubview行置于创建单元格的if条件下
if (cell == nil) {
CGRect frame = CGRectMake(0, 0, 44, 44);
CGRect loginLabelFrame = CGRectMake(60, 0, 200, 10);
CGRect fullNameLabelFrame = CGRectMake(60, 20, 200, 10);
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
asyncImage = [[[AsyncImageView alloc]initWithFrame:frame] autorelease];
[cell.contentView addSubview:asyncImage];
loginLabel = [[[UILabel alloc] initWithFrame:loginLabelFrame] autorelease];
[cell.contentView addSubview:loginLabel];
fullNameLabel = [[[UILabel alloc] initWithFrame:fullNameLabelFrame] autorelease];
[cell.contentView addSubview:fullNameLabel];
asyncImage.tag = IMAGE_TAG;
loginLabel.tag = LOGIN_TAG;
fullNameLabel.tag = FULL_NAME_TAG;
} else ...
if块之外应该发生的唯一事情是分配给每个单元格更改的属性,如[asyncImage loadImageFromURL:url]代码>并将文本指定给标签
此行将一个属性分配给可能为零的对象,然后分配该对象
loginLabel.tag = LOGIN_TAG;
loginLabel = [[[UILabel alloc] initWithFrame:loginLabelFrame] autorelease];
loginLabel = [[[UILabel alloc] initWithFrame:loginLabelFrame] autorelease];
loginLabel.tag = LOGIN_TAG;
而是在创建对象后指定属性
loginLabel.tag = LOGIN_TAG;
loginLabel = [[[UILabel alloc] initWithFrame:loginLabelFrame] autorelease];
loginLabel = [[[UILabel alloc] initWithFrame:loginLabelFrame] autorelease];
loginLabel.tag = LOGIN_TAG;
这一行使用了一个格式化的字符串,其中一个简单的赋值就可以了
loginLabel.text = [NSString stringWithFormat:@"%@",mySTUser.login];
相反,假设mySTUser.login,只需直接分配它
loginLabel.text = mySTUser.login;