2010-10-26 1 views
2

У меня есть прозрачный вид таблицы (UIViewController с subview UIImageView и другой subview UITableView на вершине Ubuntu UIImageView с фоном = clearColor, UITableViewCells background = clearColor). Я также хочу, чтобы клавиши на ячейках переключали атрибут cellType между галочкой и ничем. Если я изменяю аксессуар типа UITableViewCell в tableView: didSelectRowAtIndexPath: иногда (30-50% времени, как на симуляторе ios4.1, так и на 3GS iphone, работающем os4.1) при переключении с аксессуараType None на принадлежностьType галочка с галочкой окрашивается в непрозрачный белый фон вместо прозрачного фона. Если вместо этого я перезагружаю таблицу (там, где атрибут принадлежности также устанавливается соответственно для каждой ячейки), прозрачность работает правильно в 100% случаев.Проблема с модификацией UITableViewCell accessoriesType в tableView: didSelectRowAtIndexPath:

Это ошибка? Или модифицирует ячейку в tableView: didSelectRowAtIndexPath: не правильная вещь, и эта строка должна быть перезагружена вместо этого? Или есть что-то еще, что мне не хватает?

редактировать: Вот мой didSelectRowAtIndexPath код, который показывает нежелательное поведение:

редактировать 2: Еще одна деталь того, что происходит. Это самый конец анимации отмены выбора, где возникает проблема. Флажок появляется и отображается правильно & прозрачно, пока выполняется анимация отмены выделения, и синяя подсветка постепенно исчезает. После того, как анимация отмены выбора закончится, а синий исчезнет, ​​возможно, 1/10 секунды после того, как цвет выделения полностью исчезнет, ​​когда аксессуар галочки «автоматически» становится непрозрачным без дополнительного ввода пользователем.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (self.editing) 
    { 
    } 
    else 
    { 
     [self.myTableView deselectRowAtIndexPath:indexPath animated:YES]; 
     UITableViewCell *cell = [self.myTableView cellForRowAtIndexPath:indexPath]; 

     // toggle the selection status of the selected row 
     // 
     NSNumber *rowObj = [NSNumber numberWithUnsignedInt:indexPath.row]; 
     if ([self.selectedRows containsObject:rowObj]) 
     { 
      // currently selected, now de-select 
      // 
      cell.accessoryType = UITableViewCellAccessoryNone; 
      [self.selectedRows removeObject:rowObj]; 
     } 
     else 
     { 
      // currently unselected, now select 
      // 
      cell.accessoryType = UITableViewCellAccessoryCheckmark; 
      [self.selectedRows addObject:rowObj]; 
     } 
    } 
} 
+0

Можете ли вы разместить код PLZ? – MathieuF

+0

ok отправил код didSelectRowAtIndexPath («сломанный»). Если я прокомментирую строки cell.accessoryType и добавлю [tableView reload] внизу, тогда прозрачность всегда работает. – Bogatyr

+0

Изменяет ячейку с помощью ручного вызова на [self.myTableView cellForRowAtIndexPath: indexPath]; полностью фиктивный? Я видел это в некотором коде в сети («так должно быть правдой!») И просто скопировал его. Есть ли какая-либо гарантия того, что UITableView чтит изменения в ячейке, выполненной таким образом? Основываясь на том, что я вижу, ответ кажется «не обязательно» .... – Bogatyr

ответ

0

При отладке другой проблемы в несвязаном проекте с анимацией выбора пользовательской таблицы я обнаружил, что если стиль выбора ячейки не является UITableViewCellSelectionStyleNone, то любые изменения в ячейке, выполненной в didSelectRowAtIndexPath, подвержены глюкам и другим желаемым результатам (изменения, внесенные в ячейку N, не отображаются до тех пор, пока ячейка! = N не будет выбрана позже, а анимации, выполненные в ячейке, никогда не появятся вообще). Когда я изменил стиль выделения на UITableViewCellSelectionStyleNone, все визуальные изменения ячеек, сделанные в didSelectRowAtIndexPath, сразу появятся без проблем.

0

этот метод UITableViewDelegate:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 

вызывается непосредственно перед отображением ячейки. Изменение вида аксессуаров должно работать.

+0

Спасибо за сообщение, Боб, но я не вижу, как мне помогает мой ответ. Как я уже писал, я всегда могу просто вызвать [theTableView reloadData], чтобы получить правильную работу, так как cellForRowAtIndexPath правильно назначает аксессуар. Мой вопрос: может я * во время выбора * изменить ячейку и ожидать, что ячейка будет правильно обновляться? Обратите внимание, что аксессуар * * изменился, когда я изменил его в файле didSelectRowAtIndexPath, но с видимым «сбой», связанным с прозрачностью. Мне нужен один из этих двух вопросов. – Bogatyr

2

Я думаю, что это уборщик, если переместить Toogle выбор кусок кода

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

и didSelectRowAtIndexPath вызов

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 

Таким образом, вы будете перезагружать только выбранную строку как только он будет выбран, и нет необходимости вызывать reloadData. Надеюсь, это поможет!

1

Это сообщение не обновлялось через 4 месяца, но я решил, что отправлю свое решение, поскольку оно, похоже, работает и может помочь кому-то еще с аналогичной проблемой.

Все происходит в методе didSelectRowAtIndexPath. Self.view, который я вызываю, представляет собой tableView (поэтому замените его именем вашего TableView, например, self.tableView)

// let's go through all the cells to update them as I only want one cell at a time to have the checkmark next to it 
for (int i=0; i<[self.detailsArray count]; i++) { 
    // whenever we reach the cell we have selected, let's change its accessoryType and its colour 
    if (i == indexPath.row) { 
     // that's the row we have selected, let's update its 
     UITableViewCell *cell = [self.view cellForRowAtIndexPath:indexPath]; 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     cell.textLabel.textColor = [UIColor colorWithRed:51.0f/255.0f green:102.0f/255.0f blue:153.0f/255.0f alpha:1.0f]; 
    } 
    // if it isn't the cell we have selected, let's change it back to boring dark colour and no accessoryType 
    else { 
     UITableViewCell *cell = [self.view cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]; 
     cell.accessoryType = UITableViewCellAccessoryNone; 
     cell.textLabel.textColor = [UIColor darkTextColor]; 
    } 
} 

// don't forget to deselect the row 
[self.view deselectRowAtIndexPath:indexPath animated:YES]; 
+0

Я не перепроверил сценарий с недавними sdks, возможно, ситуация, которую я заметил в своем автоответчике, исправлена, но обратите внимание, что я обнаружил сбои в обновлении строки таблицы в файле didSelectRowAtIndexPath, если только стиль выделения не является UITableViewCellSelectionStyleNone. Я также отмечаю, что вы вызываете deselectRowAtIndexPath: анимированный: после ваших визуальных изменений, пока я его вызывал. – Bogatyr

+0

Да, и вы были правы для UITableViewCellSelectionStyleNone, мне пришлось изменить мои ячейки на этот стиль, чтобы они могли обновляться :) Что касается deselectRowAtIndexPath: вы можете поместить его где угодно, это ничего не изменит. – Audioy

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