Как программно перейти к следующей / предыдущей ячейке в UITableView? - PullRequest
4 голосов
/ 15 августа 2011

У меня есть UItableview, а также две кнопки «Далее» и «Предыдущее», при нажатии на которые я должен перейти к выбору предыдущей / следующей ячейки? Является ли это возможным? Кроме того, как запомнить ячейку, которую пользователь последний раз нажал, чтобы она была выбрана при запуске?

Ответы [ 5 ]

9 голосов
/ 15 августа 2011

Реализуйте UITableViewDelegate и сохраните текущий выбранный индекс в didSelectRowAtIndexPath:

NSIndexPath *currentSelection;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    currentSelection = indexPath;
}

Тогда в вашем действии кнопки вы можете сделать что-то вроде ...

- (IBAction)didTapNextButton:(id)sender{

    //Remember to check boundaries before just setting an indexpath or your app will crash!
    if(currentSelection){
        currentSelection = [NSIndexPath indexPathForRow:currentSelection.row+1 inSection:currentSelection.section];
    }else{
        currentSelection = [NSIndexPath indexPathForRow:0 inSection:0];
    }

    [self.tableView selectRowAtIndexPath:currentSelection animated:YES scrollPosition: UITableViewScrollPositionTop];

}
3 голосов
/ 03 февраля 2016

Вот пара методов категории UITableView, которые могут найти следующий / предыдущий NSIndexPath из указанного NSIndexPath.

. Эти методы используются для разделов и пустых разделов.

@ interface (.h)

@interface UITableView(Extensions)
- (NSIndexPath *)nextIndexPathFromIndexPath:(NSIndexPath *)indexPath;
- (NSIndexPath *)prevIndexPathFromIndexPath:(NSIndexPath *)indexPath;
@end

@ реализация (.m)

@implementation UITableView(Extensions)
-(NSIndexPath *)nextIndexPathFromIndexPath:(NSIndexPath *)indexPath {
    return [self adjacentIndexPathFromIndexPath:indexPath goingForward:YES];
}

-(NSIndexPath *)prevIndexPathFromIndexPath:(NSIndexPath *)indexPath {
    return [self adjacentIndexPathFromIndexPath:indexPath goingForward:NO];
}

-(NSIndexPath *)adjacentIndexPathFromIndexPath:(NSIndexPath *)indexPath goingForward:(BOOL)goingForward {
    NSInteger delta = goingForward ? 1 : -1;

    NSInteger adjRow = indexPath.row + delta;

    if (adjRow >= 0 && adjRow < [self numberOfRowsInSection:indexPath.section]) {
        //Adjacent row in same section...
        return [NSIndexPath indexPathForRow:adjRow inSection:indexPath.section];
    }

    NSInteger adjSection = indexPath.section + delta;

    if (adjSection < 0) {
        adjSection = [self numberOfSections] - 1;
    } else if (adjSection > [self numberOfSections] - 1) {
        adjSection = 0;
    }

    NSUInteger adjSectionRows = [self numberOfRowsInSection:adjSection];

    if (!adjSectionRows) {
        //Adjacent section is empty...
        //Adjacent row in adjacent-adjacent section...
        return [self adjacentIndexPathFromIndexPath:[NSIndexPath indexPathForRow:0 inSection:adjSection] goingForward:goingForward];
    }

    adjRow = goingForward ? 0 : adjSectionRows - 1;

    //Adjacent row in adjacent section...
    return [NSIndexPath indexPathForRow:adjRow inSection:adjSection];
}

@end
1 голос
/ 15 августа 2011

Самый простой способ - просто отслеживать выбранного индекса.

  • Следить за выбранным индексом.
  • При нажатии кнопки изменить индекс.
  • Перезагрузите стол.[tableview reloadData];

Все, что вам нужно сделать, это представить выбранный индекс с помощью функции cellForRowAtIndexPath:

if (indexPath.row == 0) {
    cell.selected = true;
}

Что касается второй части, я думаю, что вы ссылаетесь на состояниеуправление.Если так, то NSUserDefaults - это то, как я обычно это делаю:)

// get 
[[NSUserDefaults standardUserDefaults] objectForKey:@"myLastSelectedIndex"]

// set to 5
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:5] forKey:@"myLastSelectedIndex"]
0 голосов
/ 15 августа 2011

Для выбора какой-либо ячейки в tableView, пожалуйста, используйте: - (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition (http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html). Для сохранения выбранного индекса Вы можете использовать много способов, но наиболее полезным является:

NSUserDefaults* def = [NSUserDefaults standardUserDefaults];
[def setObject:selectNum forKay:@"someKay"];
[def synchronize];

, я думаю.

И, в вашем случае, вам лучше отключить флажок tableView «Взаимодействие с пользователем включено».

0 голосов
/ 15 августа 2011

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

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