Метод "cellForRowAtIndexPath" UITableView вызывается дважды при резком скачке - PullRequest
1 голос
/ 03 июня 2011

Возможно, многие из нас столкнулись с этой проблемой при 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 голосов
/ 03 июня 2011

Я думаю, что немедленное решение - это просто установить флаг, который будет меняться при первом ударе, поэтому вы игнорируете второй вызов.Возможно, это не идеальное решение, и я не могу сказать вам, почему его ударили дважды, но это сработает.(Я испытал точно такое же поведение, когда реализовал делегат Apple из класса UIWebView)

РЕДАКТИРОВАТЬ:

Создайте 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.
}
...