Как запомнить выбранные строки и сохранить их после перезагрузки по умолчанию в UITableView?

С учетом исходного примера:

var objs = [ 
    { first_nom: 'Lazslo', last_nom: 'Jamf'     },
    { first_nom: 'Pig',    last_nom: 'Bodine'   },
    { first_nom: 'Pirate', last_nom: 'Prentice' }
];

Сортировка по нескольким полям:

objs.sort(function(left, right) {
    var last_nom_order = left.last_nom.localeCompare(right.last_nom);
    var first_nom_order = left.first_nom.localeCompare(right.first_nom);
    return last_nom_order || first_nom_order;
});

Примечания

  • a.localeCompare(b) - универсально поддерживается и возвращает -1,0,1, если a, a==b, a>b соответственно.
  • || в последней строке дает last_nom приоритет над first_nom.
  • Вычитание работает с числовыми полями: var age_order = left.age - right.age;
  • Отменить в обратном порядке, return -last_nom_order || -first_nom_order || -age_order;

29
задан AJFarmar 10 June 2015 в 11:55
поделиться

6 ответов

NSIndexPath *indexPath = [tableView indexPathForSelectedRow];

даст вам NSIndexPath для текущей выбранной строки. Затем вы можете сделать

[tableView selectRowAtIndexPath:indexPath 
                       animated:NO 
                 scrollPosition:UITableViewScrollPositionMiddle];

, чтобы выбрать эту строку (и показать ее в середине экрана) позже.

64
ответ дан Seamus Campbell 10 June 2015 в 11:55
поделиться

У меня был тот же вопрос, и вот как я это сделал:

В вашем tableViewController, добавьте это в эту функцию

(UITableViewCell *)tableView: (UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{    
    if(indexPath.row == 'the row you want to select')
    {
        [tableView 
            selectRowAtIndexPath:indexPath 
            animated:TRUE 
            scrollPosition:UITableViewScrollPositionNone
        ];

        [[tableView delegate] 
            tableView:tableView 
            didSelectRowAtIndexPath:indexPath
        ];

    }

}
30
ответ дан gobernador 10 June 2015 в 11:55
поделиться

Это будет сделано:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];
[tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition: UITableViewScrollPositionNone];

, где строка - это номер ячейки, который вы хотите выбрать (начинается с 0 ...), а в секции есть участок, где появляется ячейка.

9
ответ дан Nuno Costa 10 June 2015 в 11:55
поделиться

Вот как вы предварительно выбираете строку в UITableView:

[tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition: UITableViewScrollPositionNone];

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

5
ответ дан mahboudz 10 June 2015 в 11:55
поделиться

Я понимаю, что этот вопрос довольно старый (2011 г.), но просто для того, чтобы опубликовать актуальный ответ на тот случай, если кто-то (например, я) ищет эту проблему и наткнется на этот вопрос:

С iOS 9 Apple значительно улучшилась UITableView. Чтобы убедиться, что фокус не будет потерян при перезагрузке таблицы, просто сделайте это:

tableView.remembersLastFocusedIndexPath = Yes;

, и он будет «магически работать».

Еще лучше, внедрите

- (NSIndexPath *)indexPathForPreferredFocusedViewInTableView:(UITableView *)tableView

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

До iOS 9 я обычно просто писал свой собственный метод reloadData, который получает текущую выбранную строку, перезагружает таблицу и затем выбирает ее снова. Либо в UITableViewController, либо, если мне нужно это для работы с таблицей, в которой я не могу предотвратить прямой вызов кода reloadData, я подклассифицировал UITableView и переопределил reloadData (эй, делегирование является предпочтительным способом, но иногда вы просто приходится создавать подклассы и переопределять даже в iOS).

4
ответ дан Mecki 10 June 2015 в 11:55
поделиться

Используйте следующий код, чтобы получить выбранные строки в табличном представлении. :)

NSArray *selectedRows=[tableView indexPathsForSelectedRows];
        NSMutableArray *rownumberArray=[[NSMutableArray alloc]init];
        for (int i=0; i<selectedRows.count; i++) {
            NSIndexPath *indexPath = [selectedRows objectAtIndex:i];
            NSInteger row = indexPath.row;
            NSNumber *number = [NSNumber numberWithInteger:row];
            [rownumberArray addObject:number];
        }

// rownumberArray содержит номера строк выбранных ячеек.

0
ответ дан karthikc217 10 June 2015 в 11:55
поделиться