2013-04-23 32 views
2

所以我有顯示一個UITableView我的數據的麻煩。我相信這與重用單元格有關。我已經在網上查詢過,但沒有找到適合我的解決方案。任何幫助,將不勝感激。表視圖的煩惱與離隊細胞

我有一個由文字和圖片填充的數組。然後我在tableView中顯示信息。如果我使用靜態大小的單元格,一切正常,但是文本的數量會發生變化,所以我也實現了heightForRowAtIndexPath方法。這也適用,直到我滾動到底部。

之後,當我向後滾動起來,所有單元格的高度發生變化,顯示得到所有混亂。一些文本被切斷,圖片被切掉,一些文本只有文本的最後部分。我真的認爲這與重用單元格有關,但我不知道如何解決這個問題。以下是我的代碼cellForRowAtIndexPathheightForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

if (cell == nil) 
{ 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
} 

if ([[_theBigArray objectAtIndex:indexPath.row] isKindOfClass:[NSString class]]) 
{ 
    NSString *label = [_theBigArray objectAtIndex:indexPath.row]; 
    CGSize stringSize = [label sizeWithFont:[UIFont systemFontOfSize:15] constrainedToSize:CGSizeMake(320, 9999) lineBreakMode:NSLineBreakByWordWrapping]; 

    UITextView *textV = [[UITextView alloc] initWithFrame:CGRectMake(5, 5, 290, stringSize.height +50)]; 
    textV.font = [UIFont systemFontOfSize:15]; 
    textV.text = [_theBigArray objectAtIndex:indexPath.row]; 
    textV.textColor = [UIColor blackColor]; 
    textV.editable = NO; 
    [cell.contentView addSubview:textV]; 
} 
else if ([[_theBigArray objectAtIndex:indexPath.row] isKindOfClass:[UIImage class]]) 
{ 
    UIImageView *imageV = [[UIImageView alloc] initWithFrame:CGRectMake(5, 5, 290, 100)]; 
    imageV.contentMode = UIViewContentModeScaleAspectFit; 
    imageV.image = [_theBigArray objectAtIndex:indexPath.row]; 
    [cell.contentView addSubview:imageV]; 
} 

return cell; 
[tableView reloadData]; 
} 

對於heightForRowAtIndexPath

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 


int rowHeight = 0.0f; 

if ([[_theBigArray objectAtIndex:indexPath.row] isKindOfClass:[NSString class]]) 
{  
    NSString *temp = [_theBigArray objectAtIndex:indexPath.row]; 
    CGSize size = [temp sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:CGSizeMake(320, 9999) lineBreakMode:NSLineBreakByWordWrapping]; 
    rowHeight = size.height+50; 
} 
else if ([[_theBigArray objectAtIndex:indexPath.row] isKindOfClass:[UIImage class]]) 
{ 
    rowHeight = 115.0f; 
} 

//NSLog(@"rowHeight is %i", rowHeight); 

return rowHeight; 
[tableView reloadData]; 
} 

我甚至試圖使兩種不同的細胞,並分別給他們打電話,但同樣的事情發生。我仍然使用相同的heightForRowAtIndexPath方法。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

UITableViewCell *newCell = [[UITableViewCell alloc] init]; 

if ([[_theBigArray objectAtIndex:indexPath.row] isKindOfClass:[NSString class]]) 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 

    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"]; 
    } 

    NSString *label = [_theBigArray objectAtIndex:indexPath.row]; 
    CGSize stringSize = [label sizeWithFont:[UIFont systemFontOfSize:15] constrainedToSize:CGSizeMake(320, 9999) lineBreakMode:NSLineBreakByWordWrapping]; 
    UITextView *textV = [[UITextView alloc] initWithFrame:CGRectMake(5, 5, 290, stringSize.height +50)]; 
    textV.font = [UIFont systemFontOfSize:15]; 
    textV.text = [_theBigArray objectAtIndex:indexPath.row]; 
    textV.textColor = [UIColor blackColor]; 
    textV.editable = NO; 
    [cell.contentView addSubview:textV]; 

    newCell = cell; 
} 
else if ([[_theBigArray objectAtIndex:indexPath.row] isKindOfClass:[UIImage class]]) 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PictureCell"]; 

    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"PictureCell"]; 
    } 

    UIImageView *imageV = [[UIImageView alloc] initWithFrame:CGRectMake(5, 5, 290, 100)]; 
    imageV.contentMode = UIViewContentModeScaleAspectFit; 
    imageV.image = [_theBigArray objectAtIndex:indexPath.row]; 
    [cell.contentView addSubview:imageV]; 

    newCell = cell; 

} 

return newCell; 
[tableView reloadData]; 
} 

任何想法?

回答

2

的主要問題是,你將每次在滾動時子視圖的細胞,但當細胞再利用,就已經有這些子視圖添加。 (也就是說,當一個細胞再利用,就已經有一個UITextView或的UIImageView取決於重用標識符。)

您需要檢查是否存在第一子視圖這些;這通常是通過使用-[UIView viewWithTag]方法或通過UITableViewCell的子類並將每個視圖分配爲屬性來完成的。

(你可以看看SO質疑How to get other control value from UITableViewCell?來看看如何使用viewWithTag。我會避免子類的UITableViewCell,直到你更舒適外的現成的實現。)

而且,這行代碼:

UITableViewCell *newCell = [[UITableViewCell alloc] init]; 

是一個可怕的想法,因爲你不檢查,看看是否可以重複使用一個第一創建一個新的UITableViewCell。這打破了重複使用單元的全部目的,這是快速滾動的表現。相反,只是聲明它沒有對其進行初始化:

UITableViewCell *newCell; 

此外,在heightForRowAtIndexPath,你是

  • 聲明rowHeightint(它應該是一個CGFloat
  • 嘗試後,呼叫reloadData方法返回(這永遠不會發生,但你永遠不應該嘗試從這個方法調用reloadData)
+0

感謝您及時的回覆!我會嘗試這些事情並回復你。非常感謝您的時間! – Douglas 2013-04-23 17:16:11

+0

謝謝,如果您覺得有用,請將答案標記爲已接受。 – 2013-04-23 18:40:13

+0

所以我試着看着你鏈接到的那篇文章。但他們似乎在方法cellForRowAtIndexPath之外創建子視圖,標記它們,然後在方法中添加它們。但我在方法中創建了它們。我應該在哪裏創造它們?因爲我需要有關數組元素的信息來創建它們。根據你的建議,我也改變了一些事情。感謝那。 – Douglas 2013-04-23 21:51:28