2012-06-06 3 views
6

У меня проблема с UITableView внутри PopoverController. Когда я касаюсь ячейки, вызывается функция didSelectRowAtIndexPath и изменяется тип cellType. Пример упрощен:UITableViewCell с Checkmark не отображается

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [self.listItems objectAtIndex:indexPath.row]; 
    cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    [self.tableView reloadData]; 
    [self.popoverController dismissPopoverAnimated:YES]; 
} 

Это работает, клетка проверяются, но это не видно на моем Tableview: Я не могу видеть синий флажок. Тем не менее, в состоянии касания на ячейке, галочка отображается в белом (а фон ячейки серый). Но не отображается в состоянии по умолчанию.

У вас есть идеи, почему моя галочка не отображается в состоянии по умолчанию?

Спасибо,

Edit: Добавить скриншот, для ячейки с accessoryType = UITableViewCellAccessoryCheckmark

enter image description here

+0

для состояния по умолчанию вы должны поставить cell.accessoryType = UITableViewCellAccessoryCheckmark; внутри - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) метод indexPath. –

+0

Да, я положил его, и он работает. Моя проблема находится на дисплее ... – alexmngn

+0

Теперь по умолчанию работает, и на дисплее отсутствует то, что отсутствует –

ответ

0

Вы перезагрузки UITableView так что в теории клетки воссозданный и на этот раз без галочки. Выполните следующие действия:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [self.listItems objectAtIndex:indexPath.row]; 
    cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    [self.popoverController dismissPopoverAnimated:YES]; 
} 
+0

Но мне нужно reloadData ... – alexmngn

+0

Достаточно справедливо, тогда вам нужно как-то пометить эту конкретную ячейку. Поэтому, когда перезагружается «UITableView», галочка все равно будет там. Вы можете сохранить ссылку на 'indexPath' и в' cellForRowAtIndex', которые вы позаботились о проверке. – Peres

+0

Это не проблема, в моей 'cellForRowAtIndexPath' я проверяю и добавляю галочку, если это необходимо. Моя проблема находится на дисплее, а не в функции. – alexmngn

2

У меня была аналогичная проблема, когда после перезагрузки строки с флажком, установленной в качестве аксессуара, галочка не будет видно (но будет видно в белом цвете, когда был выбран ряд) , При тестировании вокруг проблемы я обнаружил, что флажок всегда присутствует в ячейке, он просто белый-на-белом.

Мое понимание проблемы в том, что когда я прошу перезагрузить ячейку (чтобы я мог показать ее с помощью галочки), существующая ячейка помещается в очередь повторного использования, но в это время находится в выбранном state (потому что пользователь только что выбрал его). Он все еще находится в выбранном состоянии, когда ячейка возвращается из очереди повторного использования, и вы повторно настраиваете ее в tableView: cellForRowAtIndexPath, и поскольку она выбрана, аксессуар устанавливается в белом вместо видимого цвета.

Чтобы исправить это, я добавил строку в tableView: cellForRowAtIndexPath, чтобы заставить ячейку не выбирать. Аксессуар теперь всегда отображается, когда отображается новая ячейка.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Get a reusable cell - this only works with Storyboard prototype cells 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"]; 

    // THE MAGIC BIT 
    // Force the cell to not be in a selected state.  
    cell.selected = NO; 
    // END MAGIC BIT 

    if (indexPathIsPathOfSelectedRow) { 
     // This is the selected cell, so show the checkmark accessory. 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } else { 
     // In case we're reusing a cell that previously showed a checkmark, clear it. 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 

    return cell; 
} 
3

Я пробовал ответ Джеки Бой - не помогло. Но что-то там было в ... отмене выбора

Так что я попытался отменить ячейку в didSelectRowAtIndexPath: перед добавлением галочки аксессуара:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    UITableViewCell* selectedCell = [tableView cellForRowAtIndexPath:indexPath]; 

    if (row != _selectedRow) { 

     if (selectedCell.accessoryType == UITableViewCellAccessoryNone) { 

      selectedCell.accessoryType = UITableViewCellAccessoryCheckmark; 
      _selectedRow = row; 

     } else if (selectedCell.accessoryType == UITableViewCellAccessoryCheckmark) { 

      selectedCell.accessoryType = UITableViewCellAccessoryNone; 
     } 
     [tableView reloadData]; 
    } 

}

И для меня это сработало наконец - хорошая темная галочка теперь хорошо видна в камере!

Конечно, есть часть в cellForRowAtIndexPath: как описано в ответе arexx.

0

Запуск под iOS 6.1, поведение, которое я вижу, это ячейка с белой галочкой на почти белом фоне. Похоже, что это происходит потому, что код, который рисует аксессуар галочки, считает ячейку в выделенном состоянии, поэтому вместо того, чтобы рисовать галочку в обычном синем цвете, она рисуется белым цветом.

Установка выбранного состояния ячейки не сработала для меня, но установила выделенное состояние непосредственно перед настройкой типа аксессуара. Имея следующее место, я всегда получаю синюю галочку.

cell.highlighted = NO; 
if (checked) 
    self.accessoryType = UITableViewCellAccessoryCheckmark; 
else 
    self.accessoryType = UITableViewCellAccessoryNone; 
+0

'Не работает'''''''''''' – Gank

0

Если вы хотите, чтобы перезагрузить данные, то вы должны хранить выбранный идентификатор в некоторой переменной для одного выбора, как RowIndex, а затем в

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    //check index 
    if (rowIndex==indexPath.row) 
     {cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     } 
     else{ 
      cell.accessoryType = UITableViewCellAccessoryNone; 
     } 
} 

Спасибо.

7

Это случилось со мной, когда я изменил цвет глобального оттенка на белый. Как только я понял, я зашел в UITableView и изменил цвет оттенка локально только для этой таблицы. Исправлена.

+0

Это помогло мне решить мою проблему. Если у кого-то еще есть эта проблема и вы хотите сохранить глобальный цвет оттенка, просто измените оттенок в viewDidLoad() в классе TableView: self.view.tintColor = UIColor.blackColor() – Jordan

0
-(UIImageView *)checkmarkImg{ 
    UIImage *image = [[UIImage imageNamed:@"ic_check_black_24dp.png"] changeColor:CLR_BUY]; 
    UIImageView *checkmark = [[UIImageView alloc] initWithImage:image]; 
    return checkmark; 
} 

     cell.accessoryView = [self checkmarkImg]; 
2

Шахта была самой глупой причиной. Я создал табличное представление в раскадровке, с View Controller размером 5.5 дюймов и забыл применить ограничения макета.

Затем я запустил 4-дюймовый телефон. Все выглядело отлично, за исключением того, что вид аксессуаров не был виден из-за того, что ширина таблицы была больше, чем ширина экрана телефона. Мне потребовалось 3 часа, чтобы узнать мою ошибку.

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