Как сохранить выбранную строку UITableView при возврате из дочернего экрана UINavigationController? - PullRequest
9 голосов
/ 22 июля 2011

У меня есть UITableView клиентов, где выбрана строка / клиент.Затем пользователь может добавить другое представление в стек UINavigationController, чтобы добавить нового клиента.Когда я открываю дочерний экран и возвращаюсь к UITableView, ранее выбранная строка больше не выбирается.

Я могу повторно выбрать строку в viewDidAppear (), но она выглядит плохо, так как вы можете видеть отмену выбора и выбор.Есть ли способ сохранить выбранную строку при возврате с дочернего экрана?

Ответы [ 7 ]

26 голосов
/ 23 июля 2011

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

self.clearsSelectionOnViewWillAppear = NO;

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

1 голос
/ 22 июля 2011

Если вы выберете его в viewWillAppear:, он должен быть выбран так, чтобы пользователь его не увидел.Это решит вашу проблему?

0 голосов
/ 23 июля 2011

Это возможно:

Только в одном случае: если у вас есть статическое содержимое в TAbleView,

just reload the TableView in ViewDidLoad only, not in View will Appear.


whereas make sure, you don't allow table to reload anywhere in same class in any method. Then you can achieve what you want.

Отмена выбора ячейки из-за перезагрузки TAbleView.

Но для динамического контента вам нужно использовать метод делегата:

- (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition;

В этом вам нужно передать indexPath, который вы хотите показать выбранным с scrollPostion, так же, как tableviewposition.

0 голосов
/ 23 июля 2011

Без некоторого кода я могу просто дать совет: прекратите использовать [tableView reloadData], используйте [tableView beginUpdates], [tableView endUpdates] и – insertRowsAtIndexPaths:withRowAnimation: и – reloadRowsAtIndexPaths:withRowAnimation:. Все должно работать как положено.

0 голосов
/ 22 июля 2011

Вам необходимо вызвать:

[tableView deselectRowAtIndexPath:indexPath animated:YES];

Это находится в методе делегата didSelectRowAtIndexPath для UITableView.

0 голосов
/ 22 июля 2011

Невозможно постоянно выбирать tableViewCell. Он возвращается к нормальной жизни, как только он выполняет свою задачу. Я думаю, что вы имели в виду выделенный или, кажется, выбранный , и я отвечаю на вопрос, основываясь на этом.

Получить строку, которая была выбрана в cellForRowAtIndexPath. Когда вы откроете свой навигационный контроллер и вернетесь к tableView, перейдите к cellForRowAtIndexPath и выделите эту ячейку (вы можете использовать любой UIColor по своему усмотрению) - особого способа выделить вещи нет - используйте свое воображение - Подсветка по умолчанию стиль синий, а текст белый.

Как это сделать?

  1. Найти выбранную строку в cellForRowAtIndexPath
  2. Магазин находится во внешней переменной / или NSUserDefaults, и вы также можете использовать NSUserDefaults для связи между экранами, чтобы узнать, был ли предмет выскочил с этого экрана.
  3. [tableView reloadData] в viewWillAppear
  4. Проверьте значение NSUserDefaults в cellForRowAtIndexPath и измените эту ячейку с cell.backgroundColor или чем-то еще.
0 голосов
/ 22 июля 2011

По умолчанию выбранная строка отменяется (с анимацией), когда вы возвращаетесь к этому VC.
Таким образом, если вы нажимаете DetailViewController, ячейка остается выбранной, пока вы не вернетесь к RootViewController, а затем автоматически отменяет выбор.

Раньше у меня тоже была такая проблема.Обязательно всегда вызывайте реализацию методов суперкласса, таких как viewWillAppear, viewWillDisappear и т. Д.
Кроме того, не вызывайте deselectRowAtIndexPath: вручную.

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