UITableViewCells 笔尖在我滚动时显示默认值

Posted

技术标签:

【中文标题】UITableViewCells 笔尖在我滚动时显示默认值【英文标题】:UITableViewCells nib showing default values as i scroll 【发布时间】:2013-02-14 21:41:36 【问题描述】:

我创建了一个 UITableViewCell 笔尖,我正在将其加载到我的 tableview 中,但是当我滚动表格时会发生一些奇怪的事情,如果我向下滚动进来的新单元格会在一瞬间显示默认值,然后如果我向上滚动,顶部也会发生同样的事情。

下面的代码根据 myObj 提供的数据决定加载哪个 nib,希望这是可以理解的

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

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (indexPath.section == 0) 
        // Set cell height
        [self tableView:tableView heightForRowAtIndexPath:indexPath];

        //call obj array with all of the values from my sorting algorithum
        SearchResultItem *myObj = (searchResultItem*)[dataArrayOfObjects objectAtIndex:indexPath.row];



        // This gets the year string ready  ----->

        // Create Year string
        NSString *yearRangeString = [[NSString alloc] init];

        // do some special stuff here with the years
        if ((myObj.yearStart < 1) && (myObj.yearFinish < 1))
            //            yearRangeLabel.text = @"";
            yearRangeString = @"";
        
        if ((myObj.yearStart < 1) && (myObj.yearFinish > 1))
            //            yearRangeLabel.text = [NSString stringWithFormat:@"upto %i", myObj.yearFinish];
            yearRangeString = [NSString stringWithFormat:@"upto %i", myObj.yearFinish];
        
        if ((myObj.yearStart > 1) && (myObj.yearFinish < 1))
            //            yearRangeLabel.text = [NSString stringWithFormat:@"from %i", myObj.yearStart];
            yearRangeString = [NSString stringWithFormat:@"from %i", myObj.yearStart];
        
        if ((myObj.yearStart > 1) && (myObj.yearFinish > 1))
            //            yearRangeLabel.text = [NSString stringWithFormat:@"%i to %i",myObj.yearStart, myObj.yearFinish];
            yearRangeString = [NSString stringWithFormat:@"%i to %i",myObj.yearStart, myObj.yearFinish];
        

        // adjust year string is (submodel) is avalible or not
        if (([yearSelectedString isEqualToString:@"all"]) && ([sModelSelectedString isEqualToString:@"all"])) 
            yearRangeString = [NSString stringWithFormat:@"(%@) %@", myObj.subModel, yearRangeString];
            yearRangeLabel.text = yearRangeString;
        
        else if ((![yearSelectedString isEqualToString:@"all"]) && ([sModelSelectedString isEqualToString:@"aSearchResultItemll"])) 
            yearRangeString = [NSString stringWithFormat:@"(%@)", myObj.subModel];
            yearRangeLabel.text = yearRangeString;
        
        else if (([yearSelectedString isEqualToString:@"all"]) && (![sModelSelectedString isEqualToString:@"all"])) 
            yearRangeString = [NSString stringWithFormat:@"%@", yearRangeString];
            yearRangeLabel.text = yearRangeString;
        
        else if ((![yearSelectedString isEqualToString:@"all"]) && (![sModelSelectedString isEqualToString:@"all"])) 
            yearRangeLabel.text = nil;
        

    // check year string if too large use B nibs ----->

        // Get yearRangeString width to see if you need to use a yearRangeLabel with second line
        CGSize yearStringSize = [yearRangeString sizeWithFont:[UIFont fontWithName:@"Helvetica" size:15] constrainedToSize:CGSizeMake(226, 21) lineBreakMode:NSLineBreakByWordWrapping ];

        // NSLog(@"width = %f, height = %f", yearStringSize.width, yearStringSize.height);



     // Get rest of nibs ready ----->

        // Set custom cell to display
        // check to see if there is a description, if there is choose the correct tableviewcell

        if (([myObj.note isEqualToString:@""]) && (([sModelSelectedString isEqualToString:@"all"]) || ([yearSelectedString isEqualToString:@"all"])) && (yearStringSize.width <= 100.00)) 

            // Configure the cell using custom cell
            [[NSBundle mainBundle] loadNibNamed:@"auSearchCell" owner:self options:nil];

            // Set up the different labels in each cell
            descriptionLabel.text = myObj.sDescription;
            iDLabel.text = [NSString stringWithFormat:@"%i", myObj.mID];
            cLabel.text = myObj.cDesc;
            INLabel.text = [NSString stringWithFormat:@"%i", myObj.ssID];

            cell = automativeSearchCell;
        

        /// other if statments for different types of cells

         //Disclosure Indicator
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    

    return cell;

任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

看起来你有几个问题。您不应该调用 heightForRowAtIndexPath:,它是由表视图调用的。您应该根据索引路径在那里设置您需要的任何高度。看起来您每次都将一个普通的 UITableViewCell 出队,然后如果字符串太长则切换到另一个单元格。您应该先检查字符串大小,然后将正确的单元格出列。此外,看起来您每次都在加载笔尖,因为字符串太长。相反,您应该只注册您的 nib(也许在 viewDidLoad 中),然后使用 dequeueReusableCellWithIdentifier:forIndexPath: 方法而不是您正在使用的旧方法。该方法始终保证使单元格出列,因此不需要 if cell == nil 子句。

【讨论】:

好的,谢谢.. 看来我还有一点工作要做... :( 我每次都加载笔尖的原因是有可能在同一视图上加载其他笔尖..所以我必须检查它...还有 4 个其他 if 语句我没有加入,因为它们几乎相同。 @HurkNburkS,您使用的是静态单元格吗?我问是因为你说你看到了你在笔尖中的价值。 是的,我创建了 6 个不同的静态单元格,然后从中进行选择,在我的示例代码中还有最后一个 if 语句。我知道有一种方法可以以编程方式对此进行编码,但这是在它对我来说更有意义的时候完成的......我实际上认为这里发生的是如果语句太长,线程会陷入前两个,因此允许在没有设置值的情况下看到 xib/nib .. 好像我要添加那些 if statments 下面我设置了最后一批值,这个问题不会发生。但是它必须是这个顺序,这样我才能算出年份宽度 @HurkNburkS,我不明白你在做什么——如果你使用静态单元格,你就不会使用任何普通的表格视图数据源方法,比如 celForRowAtIndexPath。【参考方案2】:

您应该检查您的 UITableViewCell *cell 对象是否为 nil(即,是否有任何东西要出列)。如果是这样,分配一个新的。

【讨论】:

奇怪的是新单元格在那里.. 它只是显示我在笔尖中的默认标签值.. 而不是加载我从 myObj 添加到它的值

以上是关于UITableViewCells 笔尖在我滚动时显示默认值的主要内容,如果未能解决你的问题,请参考以下文章

滚动时 UITableViewCells 没有被重用

从 NIB 加载的 UITableViewCells 始终为零

无法滚动包含 UITextFields 的 UITableViewCells

滚动 UITableviewcells 时 IndexPath 值发生变化?

UITextField 值在滚动时消失并重新出现在其他 UITableViewCells [重复]

向 UITableViewCells 添加子视图会导致滚动时出现问题