UITableView是ios开发中使用率极高的一个控件,就我个人来说,几乎我做的每一个View上都有她的身影。但是很长一段时间,我对她的理解都很肤浅。对我来说触动较大的两个东西,一个是前面提到的自定义UITableViewCell,再有就是今天要提的这个复用了。 _objects = [[NSMutableArray alloc] init]; for (int i = 0; i < 10; i++) { [_objects addObject:[NSString stringWithFormat:@"text %d",i]]; } [_objects addObject:@"加载更多"]; for (int i = 0; i < 10; i++) { [_objects addObject:[NSString stringWithFormat:@"text %d",i]]; } 我们在一个数组里加了21条数据,而且中间那条不一样,属于我们说的数据结构不一致的那种。 NSString *_text = [_objects objectAtIndex:indexPath.row]; //我们希望“加载更多”这行是居中显示 if (![_text hasPrefix:@"text"]) { cell.textLabel.textAlignment = UITextAlignmentCenter; } cell.textLabel.text = _text; ok,我们运行一下: if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; } 改成了: if (cell != nil) { [cell release]; } cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 是的,在我这么改完以后,UITableView看起来确实是按我想的方式工作了,事实上很长的时间里都没再出过错。(不要问我为什么不在if后面跟个else把文本的属性设成“文本居左”(UITextAlignmentLeft),因为实际的数据比这复杂的多。)这种方法一直工作的很ok(确切的说是在iphone4上),直到很久以后,我把同样的程序在itouch上一跑,没载入多少条数据就提示Received memory warning了。。。。。 NSString *_text = [_objects objectAtIndex:indexPath.row]; UITableViewCell *cell; if ([_text hasPrefix:@"text"]) { static NSString *CellIdentifier = @"Cell"; cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; } } else { static NSString *CellIdentifier = @"CellReuse"; cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; } cell.textLabel.textAlignment = UITextAlignmentCenter; } cell.textLabel.text = _text; 再运行试一下,是不是怎么上下拖动也不报错了:) 完整工程下载: 这么久了,想必博主已经找到正确的方法了。但还是帮博主充实一下评论吧 确切的说,Cell复用下,如果有多种不同的cell,应该定义各自对应的不同Identifier。把重用的cell pool分成几个不同的queue,然后再根据需要的cell类型去对应的queue里取重用的cell就好了。 比如: NSString *CellIdentifier; cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; |
|