滚动tableview时,UITableviewcell cell.textlabel.text会重复吗?如何避免cell.textlabel.text重复?

时间:2015-10-13 06:53:59

标签: ios objective-c iphone xcode uitableview

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

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    cell.selectionStyle = UITableViewCellSelectionStyleBlue;

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

    cell.textLabel.textColor=[UIColor blackColor];
    cell.textLabel.font=[UIFont fontWithName:@"Helvetica Neue" size:14.0];


    if (indexPath.section == 0) {
    switch (indexPath.row) {
        case 0:
            cell.textLabel.text=@"Sub-Scheme 1";
              break;

        case 1:
            cell.textLabel.text=@"Sub-Scheme 2";
            break;

        case 2:
            cell.textLabel.text=@"Sub-Scheme 3";
            break;

        case 3:
            cell.textLabel.text=@"Sub-Scheme 4";
            break;
        case 4:
            cell.textLabel.text=@"Sub-Scheme 5";
            break;


        default:
            break;
    }
    }else{
        cell.textLabel.text=@" ";

    }

    return cell;
}

5 个答案:

答案 0 :(得分:1)

使用不同的单元格标识符

例如像贝娄......

- (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..
    }
}

或者设置为零,如下...

- (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 :(得分:1)

不要重复使用细胞是最简单的方法。

package com.checkaidev1;

public class ItemAnalysis {
    public int itemNumber;
    public String correctKey;
    public double itemDifficulty;
    public String evaluation;

    // Empty constructor
    public ItemAnalysis(){

    }

    public ItemAnalysis(int itemNumber, String correctKey, double itemDifficulty, String evaluation){
        this.itemNumber = itemNumber;
        this.correctKey = correctKey;
        this.itemDifficulty = itemDifficulty;
        this.evaluation = evaluation;

    }

    // getting name
    public int getItemNumber(){
        return this.itemNumber;
    }

    // setting name
    public void setItemNumber(int itemNumber){
        this.itemNumber = itemNumber;
    }

    // getting name
    public String getCorrectKey(){
        return this.correctKey;
    }

    // setting name
    public void setCorrectKey(String correctKey){
        this.correctKey = correctKey;
    }

    public double getItemDifficulty(){
        return this.itemDifficulty;
    }

    // setting name
    public void setItemDifficulty(double itemDifficulty){
        this.itemDifficulty = itemDifficulty;
    }

    public String getEvaluation(){
        return this.evaluation;
    }

    // setting name
    public void setEvaluation(String evaluation){
        this.evaluation = evaluation;
    }
希望它适合你。

答案 2 :(得分:1)

您必须使用dequeueReusableCellWithIdentifier:重复使用单元格才能获得更好的性能和内存优化。

你的核心问题是别的。在重新使用之前,您不会重置单元格。我的建议是在出列操作后重置单元格文本标签cell.textLabel.text = @"",然后在交换机中设置标签。

我建议您在切换到不重复使用单元格之前尝试一次。

基本上,这就是你的代码应该是这样的:

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

    static NSString *cellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    cell.selectionStyle = UITableViewCellSelectionStyleBlue;

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

    cell.textLabel.textColor = [UIColor blackColor];
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:14.0];
    cell.textLabel.text = @""; // Reset Text Label before re-using

     ... rest of your code...
} 

答案 3 :(得分:1)

参见下面的编码。我试过这个。当我滚动tableview时,不再重复cell.textLabel.text

    NSMutableArray *arrayRepeat;

在viewDidLoad

   arrayRepeat = [[NSMutableArray alloc]initWithObjects:@"Sub-Scheme 1",@"Sub-Scheme 2",@"Sub-Scheme 3",@"Sub-Scheme 4",@"Sub-Scheme 5", nil];

UITableViewDataSource方法

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

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
  return arrayRepeat.count;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   static NSString *CellIdentifier = @"Cell";
   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
   cell.selectionStyle = UITableViewCellSelectionStyleBlue;
   if (cell == nil) 
   {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
   }
   cell.textLabel.textColor = [UIColor blackColor];
   cell.textLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:14.0];
   cell.textLabel.text = [NSString stringWithFormat:@"%@",[arrayRepeat objectAtIndex:indexPath.row]];  

   return cell;
}

答案 4 :(得分:0)

必须重复使用细胞,不将它们出列并不是一个好的解决方案。您遇到的问题当然与单元格的出列有关,但如果为所有情况提供文本标签的值,则可以解决该问题。

如果您使用此替换默认情况,可能会解决您的问题:

default: cell.textLabel.text=@""; break;