2013-03-11 2 views
10

Я пытаюсь отобразить значок «Навесной замок» на конкретных строках моего UITableViewCells с помощью этого кода:UITableView вопрос клетки accessoryView изображения

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TopicCell"]; 

    GPBTopic *topic = [self.topics.list objectAtIndex:indexPath.row]; 
    cell.textLabel.text= topic.name; 

    if ((indexPath.row == 5) || (indexPath.row == 9)) 
    { 
      cell.accessoryView = [[ UIImageView alloc ] initWithImage:[UIImage imageNamed:@"lock_icon.png"]];; 
      [cell.accessoryView setFrame:CGRectMake(0, 0, 24, 24)]; 

    } 

    return cell; 
} 

Я получаю забавный результат - висячий замок первоначально показан на строках 5 , 9, но когда я прокручиваю вниз и вверх по списку, значок снова отображается в аксессуарах других аксессуаров других элементов (есть только 1 секция кстати), и прокрутка становится довольно рывкой и ломаной ... Чем больше я просматриваю вверх/вниз тем больше экземпляров отображается! Почему? где ошибка здесь?

help, thanks!

+0

, потому что клетка была повторно использовать для других строк при прокрутке, я думаю, вы должны использовать другой CellReuseIdentifier для строки 5 и 9 –

+0

, как я могу это сделать? – mindbomb

ответ

21

Клетки повторно используются. Вы должны каждый раз перезапускать аксессуар. Его просто небольшое изменение:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TopicCell"]; 

    GPBTopic *topic = [self.topics.list objectAtIndex:indexPath.row]; 
    cell.textLabel.text= topic.name; 

    if ((indexPath.row == 5) || (indexPath.row == 9)) 
    { 
     cell.accessoryView = [[ UIImageView alloc ] initWithImage:[UIImage imageNamed:@"lock_icon.png"]]; 
     [cell.accessoryView setFrame:CGRectMake(0, 0, 24, 24)]; 
    } else { 
     cell.accessoryView = nil; 
    } 

    return cell; 
} 

Просто для завершения, вы можете также использовать решение Эрика, как это - это может быть быстрее, так как ImageView не создается каждый раз. Но это лишь минимальная разница. Вероятно, у ваших лагов есть и другие причины.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = nil; 
    if(indexPath.row == 5 || indexPath.row == 9) { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"TopicCellWithImage"]; 
     cell.accessoryView = [[ UIImageView alloc ] initWithImage:[UIImage imageNamed:@"lock_icon.png"]];; 
     [cell.accessoryView setFrame:CGRectMake(0, 0, 24, 24)]; 
    } else { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"TopicCell"]; 
    } 

    GPBTopic *topic = [self.topics.list objectAtIndex:indexPath.row]; 
    cell.textLabel.text= topic.name; 

    return cell; 
} 
+0

ОК, спасибо! Я проверю его позже. но на самом деле мне нужны ячейки, у которых нет изображения, чтобы показать значок «раскрытия» серого прямоугольного значка – mindbomb

+0

да 5 и 9 все равно покажут изображение. другие нет. просто попробуйте. – calimarkus

+0

и прочитайте документацию uitableview - это объясняет повторное использование. – calimarkus

0
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell; 
    if(indexPath.row == 5 || indexPath.row == 9) { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"TopicCellWithImage"]; 
    } else { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"TopicCell"]; 
    } 

    GPBTopic *topic = [self.topics.list objectAtIndex:indexPath.row]; 
    cell.textLabel.text= topic.name; 

    if ((indexPath.row == 5) || (indexPath.row == 9)) 
    { 
     cell.accessoryView = [[ UIImageView alloc ] initWithImage:[UIImage imageNamed:@"lock_icon.png"]];; 
     [cell.accessoryView setFrame:CGRectMake(0, 0, 24, 24)]; 

    } 

    return cell; 
} 
+0

Извините, не правильно, решение jaydee3 намного проще .. спасибо! – mindbomb

Смежные вопросы