2015-02-05 1 views
0

У меня есть обычай UITableViewCell. Когда ячейка выбрана, к ней добавляется UILabel. Я должен был использовать prepareForReuse для того, чтобы не запутаться, так как:Отключить prepareForReuse для выбранной ячейки

- (void)prepareForReuse { 
    NSArray *viewsToRemove = [self.view subviews]; 
    for (UILablel *label in viewsToRemove) { 
     [label removeFromSuperview]; 
    } 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CategorieCell *customCell = [tableView dequeueReusableCellWithIdentifier:@"cellID" forIndexPath:indexPath]; 
    return customCell; 
} 

Проблема заключается в том, когда я прокручиваю вниз достаточно, чтобы метка находится вне поля зрения, а потом прокрутить назад, этикетка не там больше. Причина в том, что, когда ячейки снова используются, я удалял все метки.

Так есть способ отключить prepareForReuse (или только код в методе) для выбранной строки и как?

+0

Не получилось, не могли бы вы объяснить это. – Saif

+0

Какую часть вы не понимаете? –

+0

Можете ли вы опубликовать Cell For Row Method, .. – Saif

ответ

0

Think таблицы ячейки как немые контейнеры, которые повторно используются для хранения разных вещей (ярлыки, изображения, кнопки и т. д.).

Вы заполняете ячейки в cellForRowAtIndexPath.

Вы опорожняете их в prepareForReuse, чтобы их можно было снова заполнить и повторно использовать.

Не путайте эти два действия.

Когда вы заполняете ячейку, вы должны ее заполнять из данных, которые вы сохранили где-то в другом месте, то есть не из других ячеек. Если вы полагаетесь на indexPathsOfSelectedCells, чтобы помочь вам при заполнении своей ячейки, у вас возникнут проблемы. Не делай этого.

Обычно у вас должен быть массив объектов, каждый из которых соответствует ячейке. У вас столько клеток в вашей таблице, сколько объектов в массиве. Вы можете инициализировать объекты в своем массиве в viewDidLoad или передать их с предыдущего контроллера представлений.

Этот процесс не должен быть сложным. Большинство ячеек отображает только несколько бит данных, поэтому ваш объект (часто называемый моделью) не должен иметь много свойств для хранения этих данных.

Когда пользователь выбирает ячейку, задайте для этого объект "selected" в соответствующем объекте. Это значение остается в объекте, даже когда ячейка прокручивается с экрана и повторно используется. Это хорошо.

Теперь, когда пользователь прокручивает обратно в ячейку, вы заполняете ячейку данными из соответствующего объекта. Поскольку этот объект имеет свой «выбранный» набор свойств, вы «заполняете» ячейку, добавляя в этом случае метку, которую вы хотите там.Если он не установлен, вы не добавляете метку.

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

1

Ячейки, которые прокручиваются, будут использоваться повторно, и вокруг него нет никакого способа. Даже если вы избегаете логики removeFromSuperview, эта ячейка снова появится на другом пути указателя, вероятно, не там, где вы этого хотите.

Способ условной настройки ячеек находится в cellForRowAtIndexPath. Там вы можете спросить, является ли indexPath одним из индексов таблицы TablePathsOfSelectedCells. Если это так, то настройте его с помощью дополнительных меток или нет, если нет.

Одним из способов уменьшить беспорядок является то, что эти ярлыки остаются в ячейке безоговорочно, просто устанавливая их альфы в 0 или 1, в зависимости от состояния выбора.

Например, в

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

    // if you know the table has singular selection 
    NSIndexPath *selectedIndexPath = [tableView indexPathForSelectedRow]; 
    BOOL rowIsSelected = [indexPath isEqual:selectedIndexPath]; 

    // OR, for multiple select... 
    NSArray *selection = [tableView indexPathsForSelectedRows]; 
    BOOL rowIsSelected = [selection containsObject:indexPath]; 

    // now either conditionally create/destroy or show/hide the subviews 
    // that appear on selection (I prefer show/hide for simpler cells)... 

    [cell configAsSelected:rowIsSelected]; // have the custom cell do it 

    // in that method, or here, if you're less OO-inclined... 
    cell.subviewThatAppearsOnSelected.alpha = (rowIsSelected)? 1.0 : 0.0; 

Чем больше точка, это Рекомендованное место, чтобы надежно настроить ячейку на основе модели и ее текущей позиции в таблице

+0

in cellForRow ... Я сделал оператор if следующим образом: if (indexPath == [tableview indexPathForSelectedRow) {...}, и это не сработало –

+0

Это == тесты, если те же объекты. Более общий тат, если ссылаться на одну и ту же строку: isEqual: – danh