Сохранение выбора при обновлении UITableView через reloadData - PullRequest
8 голосов
/ 20 марта 2012

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

NSIndexPath *indexPath=[NSIndexPath indexPathForRow:0 inSection:0];
[dateTableView selectRowAtIndexPath:indexPath animated:YES  scrollPosition:UITableViewScrollPositionBottom];

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

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

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

Моя задача включена ниже:

-(IBAction)dateChanged
{

   NSIndexPath *index = self.dateTableView.indexPathForSelectedRow;
    if(index == 0)
    {
        if (self.date2 == plusOne ) {
            self.date = [datePicker date];
            plusOne = [self.date dateByAddingTimeInterval:60*60];
            self.date2 = plusOne;
        }
        else
        {
            self.date = [datePicker date];
        }

    }
    else{
        self.date2 = [datePicker date];
    }

    [dateTableView reloadData];
}

Примечание: plusOne - это переменная, которая первоначально указывает час с текущего времени.

Заранее спасибо!

Ответы [ 2 ]

13 голосов
/ 20 марта 2012

Для первой проблемы установите animated: NO в вызове метода.В настоящее время вы устанавливаете его на YES.

[dateTableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionBottom];

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

    if(index == 0)

Вы спрашиваете, равен ли указатель на объект 0. Я думаю, вам нужно либо проверить, что index == nil, либо index.section == 0 && index.row == 0, либо что-то в этом роде.

В любом случае, если вывызовите reloadData на UITableView, вы потеряете выбор.На этом этапе вам нужно выбрать новую строку.Если в вашей модели данных есть элемент, который вы хотите выбрать, вам нужно выяснить, где он находится, и выбрать его в зависимости от того, где он будет находиться в таблице (вы должны знать об этом, поскольку вы предоставляете эту информацию в делегате UITableViewDataSourceметоды.).В качестве альтернативы, если вы хотите выбрать NSIndexPath, который вы сохранили в первой строке dateChanged, просто выберите его после перезагрузки данных.

1 голос
/ 20 марта 2012

Для первой проблемы напишите свой код в didSelectRowAtIndexPath: в методе.Затем вы можете вызвать этот метод из didSelectRowAtIndexPath: вы должны передать indexPath в качестве аргумента вашей функции, например,

-(void)doActionsInDidSelectRow:(NSIndexPath*)indexPath{
     // write code.
}

В viewDidLoad вызовите этот метод как

-(void)viewDidLoad{

        NSIndexPath *indexPath=[NSIndexPath indexPathForRow:0 inSection:0];
        [dateTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionBottom];
        [self doActionsInDidSelectRow:indexPath];
 }

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

[dateTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionBottom];

.Надеюсь, что это решит ваши проблемы.

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