Ячейки iPhone UITableView остаются выбранными - PullRequest
45 голосов
/ 22 мая 2009

в моем 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;   
}
   }

Ответы [ 7 ]

98 голосов
/ 22 мая 2009

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

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

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

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

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

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

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

21 голосов
/ 16 июля 2011

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

11 голосов
/ 06 мая 2011

Просто чтобы расширить ответ «Эд Марти», я решил добавить отмену выбора в методе «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];
}
8 голосов
/ 04 апреля 2013

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

self.clearsSelectionOnViewWillAppear = YES;
4 голосов
/ 06 сентября 2013

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

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

    // Do smth here. segue ..etc

    [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];
}
0 голосов
/ 24 февраля 2016

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

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

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

    if arrayOf_SelectedCells.contains(indexPath) {
        setup_Selected(cell)
        //Where setup_Selected is a custom function to apply formatt
    } else {
        setup_Unselected(cell)
    }
0 голосов
/ 14 апреля 2015

Используйте этот метод в вашем 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];

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...