Подтвердить что ты не робот

Ячейки iPhone UITableView остаются выбранными

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

Любые подсказки? Может быть, это имеет какое-то отношение к неэффективному выпуску tableView?

    - (void)tableView:(UITableView *)tableView 
    didSelectRowAtIndexPath:(NSIndexPath *)indexPath{   
    NSUInteger row = [indexPath row];

    [tableView deselectRowAtIndexPath:indexPath animated:YES];

switch (row) {
    case 0:
        FruitViewController *fruitController = [FruitViewController alloc];
        [fruitController retain];
        [fruitController initWithNibName:@"FruitView" bundle:[NSBundle mainBundle]];
        [self.navigationController pushViewController:fruitController animated:YES];
        [fruitController release];
        break;
    case 1: 
        CerealsViewController *cerealsController = [CerealsViewController alloc];
        [cerealsController retain];
        [cerealsController initWithNibName:@"CerealsView" bundle:[NSBundle mainBundle]];
        [self.navigationController pushViewController:cerealsController animated:YES];
        [cerealsController release];
        break;
    default:
        break;   
}
   }
4b9b3361

Ответ 1

Я не могу сказать вам, почему вы видите проблему, но вот несколько советов по ее исправлению:

В соответствии с Apple HIG выбор не должен исчезать до тех пор, пока не вернется из контроллера просмотра, просто нажатого на стек. Если ваш контроллер является только UITableViewController, он должен автоматически отменить выбор после возврата в представление. Если нет, добавьте

- (void) viewWillAppear:(BOOL)animated {
    [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:animated];
    [super viewWillAppear:animated];
}

где-то в контроллере представления.

Если есть какие-либо строки, которые при щелчке не переходят в другое представление и на самом деле ничего не делают при выборе, они не должны выбираться, поэтому вы можете переопределить это в

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

и верните nil в случаях, когда строка не должна быть выбрана.

Ответ 2

Одна из возможных причин заключается в переопределении -viewWillAppear:animated: без вызова [super viewWillAppear] в контроллере, который расширяет UITableViewController. Добавление [super viewWillAppear:animated] в начале вашего метода -viewWillAppear может устранить проблему.

Ответ 3

Чтобы увеличить ответ "Ed Marty", я решил добавить отмену в методе "viewWillDisappear", потому что я думал, что это выглядит лучше.

В дополнение к этому я использовал UITableView с обычным UIViewController (а не UITableViewController), поэтому переменная tableView не была доступна мне. Чтобы преодолеть это, я добавил свойство tableView в свой заголовочный файл диспетчера вида (и в моем XIB файле я подключил фактическое представление таблицы к свойству)...

@property (nonatomic,retain) IBOutlet UITableView *tableView

... и в реализации контроллеров представления подключили свойство и выполнили снятие выделения следующим образом.

@synthesize tableView

- (void) viewWillDisappear:(BOOL)animated {
    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:animated];
    [super viewWillDisappear:animated];
}

Ответ 4

Если вы используете UITableViewController, вы можете использовать:

self.clearsSelectionOnViewWillAppear = YES;

Ответ 5

В моем случае я сниму ячейку прямо в конце didSelectRowAtIndexPath:

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

    // Do smth here. segue ..etc

    [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];
}

Ответ 6

Используйте этот метод в классе UITableViewCell

(void)setSelected:(BOOL)selected animated:(BOOL)animated {

// Just comment This line of code

// [super setSelected:selected animated:animated];

}

или даже вы можете попробовать этот код в методе didSelectRowAtIndexPath

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

// Делаем некоторые вещи при выборе строки

[tableView deselectRowAtIndexPath:indexPath animated:YES];

}

Ответ 7

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

Как только ячейки прокручиваются с экрана, они теряют свое форматирование. Таблица минимизирует использование памяти, отклоняя другие ячейки и воссоздавая их, если/когда пользователь прокручивает назад.

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

    if arrayOf_SelectedCells.contains(indexPath) {
        setup_Selected(cell)
        //Where setup_Selected is a custom function to apply formatt
    } else {
        setup_Unselected(cell)
    }