С учетом исходного примера:
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;
NSIndexPath *indexPath = [tableView indexPathForSelectedRow];
даст вам NSIndexPath
для текущей выбранной строки. Затем вы можете сделать
[tableView selectRowAtIndexPath:indexPath
animated:NO
scrollPosition:UITableViewScrollPositionMiddle];
, чтобы выбрать эту строку (и показать ее в середине экрана) позже.
У меня был тот же вопрос, и вот как я это сделал:
В вашем 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
];
}
}
Это будет сделано:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];
[tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition: UITableViewScrollPositionNone];
, где строка - это номер ячейки, который вы хотите выбрать (начинается с 0 ...), а в секции есть участок, где появляется ячейка.
Вот как вы предварительно выбираете строку в UITableView:
[tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition: UITableViewScrollPositionNone];
Установите indexPath в качестве строки, которую вы хотите выбрать, а затем выполните вызов метода, как указано выше.
Я понимаю, что этот вопрос довольно старый (2011 г.), но просто для того, чтобы опубликовать актуальный ответ на тот случай, если кто-то (например, я) ищет эту проблему и наткнется на этот вопрос:
С iOS 9 Apple значительно улучшилась UITableView
. Чтобы убедиться, что фокус не будет потерян при перезагрузке таблицы, просто сделайте это:
tableView.remembersLastFocusedIndexPath = Yes;
, и он будет «магически работать».
Еще лучше, внедрите
- (NSIndexPath *)indexPathForPreferredFocusedViewInTableView:(UITableView *)tableView
в UITableViewDelegate
, чтобы таблица знала, какую строку вы хотите выбрать, когда она отображается в первый раз.
До iOS 9 я обычно просто писал свой собственный метод reloadData
, который получает текущую выбранную строку, перезагружает таблицу и затем выбирает ее снова. Либо в UITableViewController
, либо, если мне нужно это для работы с таблицей, в которой я не могу предотвратить прямой вызов кода reloadData
, я подклассифицировал UITableView и переопределил reloadData
(эй, делегирование является предпочтительным способом, но иногда вы просто приходится создавать подклассы и переопределять даже в iOS).
Используйте следующий код, чтобы получить выбранные строки в табличном представлении. :)
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 содержит номера строк выбранных ячеек.