2013-07-04 96 views
1

我使用波紋管代碼在TableView上顯示數據,但滾動時,數據重複和其他數據丟失。滾動時在UITableView中重複數據

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [FileCompletedArray count]; 

} 

的cellForRowAtIndexPath():

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

    static NSString *CellIdentifier = @"CellIdentifier"; 

    UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

     UILabel *FileNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, 100, 30)]; 
     FileNameLabel.backgroundColor = [UIColor clearColor]; 
     FileNameLabel.font = [UIFont fontWithName:@"Helvetica" size:16]; 
     FileNameLabel.font = [UIFont boldSystemFontOfSize:16]; 
     FileNameLabel.textColor = [UIColor blackColor]; 
     NSLog(@"Reseversed TEMP array %@",FileCompletedArray); 
     FileNameLabel.text =[FileCompletedArray objectAtIndex:indexPath.row]; 
     [cell.contentView addSubview: FileNameLabel]; 
     [FileNameLabel release]; 



    } 
     return cell; 
} 

你有什麼辦法呢?在此先感謝

回答

3

不同的使用小區標識

例如像波紋管......

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

    NSString *CellIdentifier = [NSString stringWithFormat:@"%d,%d",indexPath.section,indexPath.row]; 

    UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     /// write your code here.. 
    } 
} 

OR設置nil像波紋管..

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

    //static NSString *CellIdentifier = @"CellIdentifier";  

    UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:nil]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease]; 
     /// write your code here.. 
    } 
} 
+1

雖然這是解決方案之一,但我認爲'cell'不會被這段代碼重複使用。每次創建一個新的「單元格」。 – Krunal

+1

謝謝,它工作完美 – NGOT

+1

此代碼不會重複使用該單元格,而是每次創建新單元格。這在數據源很大的情況下會有性能問題。 **不重複**單元不是一個好的編碼習慣。 – Amar

2

您設置文本只有在創建新單元格時才能使用該標籤。但是,在單元重用期間,不會創建新單元。因此,您設置/更改文本的代碼不起作用。你可以使用這個修改過的代碼。

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

    static NSString *CellIdentifier = @"CellIdentifier"; 

    UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    UILabel *FileNameLabel=nil; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

     FileNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, 100, 30)]; 
     FileNameLabel.tag = 1001; 
     FileNameLabel.backgroundColor = [UIColor clearColor]; 
     FileNameLabel.font = [UIFont fontWithName:@"Helvetica" size:16]; 
     FileNameLabel.font = [UIFont boldSystemFontOfSize:16]; 
     FileNameLabel.textColor = [UIColor blackColor]; 
     [cell.contentView addSubview: FileNameLabel]; 
     [FileNameLabel release]; 
    } 
    if(!FileNameLabel) 
     FileNameLabel = [cell.contentView viewWithTag:1001]; 
    FileNameLabel.text =[FileCompletedArray objectAtIndex:indexPath.row]; 

    return cell; 
} 

或者你可以使用默認的textLabel不是創建和加入新的標籤

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

    static NSString *CellIdentifier = @"CellIdentifier"; 

    UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    UILabel *FileNameLabel=nil; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:16]; 
     cell.textLabel.font = [UIFont boldSystemFontOfSize:16]; 
     cell.textLabel.textColor = [UIColor blackColor]; 
    } 
    cell.textLabel.text =[FileCompletedArray objectAtIndex:indexPath.row]; 

    return cell; 
} 
3

的產生此問題,因爲你UITableView複用小區即時創建新的。 我給你一些可能對你有所幫助的建議。

1)

添加 cell.contentView.之間
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     /// Your code of initialization of controller; 
    } 

    /// set property of controllers such like (Text UILabel, image of UIImageView...etc) . 
return cell; 

} 

1)您Controller

EDITED添加Controller

你按照我的編輯答案之前,我想告訴你,下面的代碼對內存管理不利,因爲它會爲每行UITableView創建一個新的單元,所以要小心。

但是如果UITableView有限制的行(50-100可能是)使用下面的代碼更好,如果它適合你。

NSString *CellIdentifier = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row]; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if(cell == nil) 
    { 
      /// Your whole code of controllers; 
    } 
2

我也遇到了同樣的問題,當我們重複使用單元格時會出現問題。在重用數據時它已經存在了,我們還寫了更多的數據,爲了理清這一點,我對錶視圖的委託方法cellForRowAtIndexPath做了一些小改動。這裏的代碼,我總是使用表視圖。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 
if (!cell) { 
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"]; 
} 
for (UIView *view in cell.contentView.subviews) { 
    [view removeFromSuperview]; 
} 

return cell; 

}

for循環,當我們重用一些細胞和它的作用是刪除所有以前的數據出現在UITableViewCell中

希望這會幫助別人怎樣得到執行。