UITableView“cellForRowAtIndexPath”方法在突然滑动时被调用两次

时间:2011-06-03 07:51:45

标签: objective-c ios ios-4.2

我可以在UITableView委托方法- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath上遇到此问题,我们很多人会被调用两次。

在我的应用程序中,我转换了tableView。代码如下:

    CGAffineTransform transform = CGAffineTransformMakeRotation(-M_PI/2);
theTableView.transform = transform;

    theTableView.rowHeight = self.bounds.size.width;

    theTableView.frame = self.bounds;

现在在委托方法中,我正在做几件事:

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

    modelRef.currentCellAtIndexPathRow = indexPath.row;

    static NSString *CellIdentifier = @"Cell";

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) 
    {
        cell = [[[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier frame:self.bounds] autorelease];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }


    modelRef.currentPageIndex = (indexPath.row + 1);

    [cell showPage];

    NSLog(@" visible cell %i ",[[tableView visibleCells] count]);


    return cell;
}

此时1个单元格可见,但第一次启动应用程序时。日志显示可见的单元格0。

很多时候,这种特殊的委托方法会被突然调用两次。

有任何想法或任何建议如何解决这个问题?

非常感谢提前。

问候。

1 个答案:

答案 0 :(得分:0)

我认为立即修复只是设置一个标志,它会在第一次命中时更改,因此您忽略第二次调用。它可能不是完美的解决方案,我无法告诉你为什么会被击中两次 - 但这会有效。 (当我从UIWebView类实现Apple代理时)我经历了完全相同的行为

编辑:

在类标题中创建一个BOOL成员,然后在init中将值设置为YES。因此,如果BOOL被称为mbIsFirstCall,请在您的委托方法中执行以下操作:

if (mbIsFirstCall)
{
    // do your processing, then the line below
    mbIsFirstCall = NO;
}
else
{
    // you don't need this else, but just for clarity it is here.
    // you should only end up inside here when this method is hit the second time, so we ignore it.
}