在寫sina 微博界面的過程當中使用到了cell,那麼就是在cell上添加一些控件,可是因爲每條微博的內容都是不一樣的,因此在顯示的過程當中,出現了內容重疊的問題,其實就是UITableViewCell重用機制的問題。spa
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath .net
{ code
static NSString *CellIdentifier = @"Cell"; orm
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; blog
if (cell == nil) { rem
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; get
} string
return cell;it
} io
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
return cell;
}
複製代碼
TableView的重用機制,爲了作到顯示和數據分離,IOS tableView的實現而且不是爲每一個數據項建立一個tableCell。而是隻建立屏幕可顯示最大個數的cell,而後重複使用這些cell,對cell作單獨的顯示配置,來達到既不影響顯示效果,又能充分節約內容的目的。
解決方法一:對在cell中添加的控件設置tag的方法
例如在微博內容中須要添加label,那麼就能夠對添加的label設置tag,而後新建cell的時候先remove前一個cell tag相同的label,再添加新的label,這樣就不會出現cell內容的重疊。
[[cell viewWithTag:100] removeFromSuperview];
[[cell contentView] addSubview:contentLabel];
解決方法二:刪除cell中的全部子視圖
在實現微博界面中,一個cell會有多個控件(label,imageview...),按理說,對每個控件都設置tag,按照第一種解決方法,應該是能夠實現的。可是在實際運行過程當中發現不行,仍是會出現內容重疊的問題,因此採用第二種解決方法--在新建cell的時候,若是不是空就刪除全部的子視圖。
if (cell != nil) {
[cell removeFromSuperview];//處理重用
}
解決方法三: 經過爲每一個cell指定不一樣的重用標識符(reuseIdentifier)來解決。
重用機制是根據相同的標識符來重用cell的,標識符不一樣的cell不能彼此重用。因而咱們將每一個cell的標識符都設置爲不一樣,就能夠避免cell重用問題了。
[cpp] view plaincopyprint?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d%d", [indexPath section], [indexPath row]];//以indexPath來惟一肯定cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //出列可重用的cell
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
//...其餘代碼
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d%d", [indexPath section], [indexPath row]];//以indexPath來惟一肯定cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //出列可重用的cell
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
//...其餘代碼
}