UITableViewCell и изображения перекрываются - PullRequest
1 голос
/ 16 сентября 2010

У меня странная проблема с моим UITableView ... Я добавляю UIButton в качестве подпредставления к каждой ячейке, но когда какая-либо из ячеек выходит из поля зрения, что-то происходит, и когда я снова прокручиваю вверх, явидно, что UIButton фоновые изображения некоторых ячеек перекрываются!

Используемый мною метод cellForRowAtIndexPath содержит следующий код, который добавляет UIButton instance

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"];

    if (cell == nil)
    {

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
                                      reuseIdentifier:@"MyCell"];

        [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];

        UIFont *titleFont = [UIFont fontWithName:@"Arial-BoldMT" size:14.0];
        [[cell textLabel] setFont:titleFont];

        [cell autorelease];


    }

    if([cell viewWithTag:indexPath.row]==nil){ 
    UIButton *buttonLeft = [UIButton buttonWithType:UIButtonTypeCustom];
    buttonLeft.tag=indexPath.row;
    if ([[myArray objectAtIndex:indexPath.row] isEqualToString:@"item1"]) {

        [buttonLeft addTarget:self action:@selector(doThat:) forControlEvents:UIControlEventTouchUpInside];
        [buttonLeft setBackgroundImage:[UIImage imageNamed:@"item1.png"] forState:UIControlStateNormal];    
        [buttonLeft setFrame: CGRectMake( 5.0f, 6.2f, 30.0f, 30.0f)];


    }else{

        [buttonLeft addTarget:self action:@selector(doThat:) forControlEvents:UIControlEventTouchUpInside];
        [buttonLeft setBackgroundImage:[UIImage imageNamed:@"item2.png"] forState:UIControlStateNormal];    
        [buttonLeft setFrame: CGRectMake( 5.0f, 6.2f, 30.0f, 30.0f)];

    }
[cell addSubview:buttonLeft];
    }


    cell.textLabel.text=[NSString stringWithFormat:@"         %@",[myArray objectAtIndex:indexPath.row]];
    return cell;
}

Видимоэтот код по какой-то причине добавляет UIButton при каждом отображении ячейки.Я хочу, чтобы каждое подпредставление кнопки было добавлено только один раз. Что я делаю не так?

Ваша помощь очень ценится

1 Ответ

4 голосов
/ 16 сентября 2010

Это связано с тем, что табличное представление повторно использует ячейки по соображениям производительности. Таким образом, метод cellForRowAtIndexPath:, правильно реализованный как ваш, возвращает уже существующие ячейки и создает новую, только если нет доступных для повторного использования ячеек.

Поместите весь код, связанный с кнопками, в if (cell == nil) {}, чтобы кнопка добавлялась только в «свежие» ячейки, и она должна работать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...