Установка положения прокрутки в UITableView - PullRequest
27 голосов
/ 05 января 2009

У меня есть приложение, которое работает примерно так же, как приложение iPhone для контактов. Когда мы добавляем новый контакт, пользователь попадает на экран просмотра только с контактной информацией. Если мы выберем «Все контакты» на панели навигации, пользователь перейдет к списку всех контактов, где отображается недавно добавленный контакт.

Мы можем переместить представление в конкретную строку, используя:

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

... но это не работает. Я звоню это сразу после звонка:

    [tableView reloadData];

Я думаю, я не должен вызывать selectRowAtIndexPath:animated:scrollPosition метод здесь. Но если не здесь, то где?

Есть ли метод делегата, который вызывается после следующего метода?

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

Ответы [ 4 ]

61 голосов
/ 20 января 2009

Мне кажется, у меня есть похожее приложение: список элементов., Нажмите «+» -> новый экран, вернитесь и увидите обновленный список, прокрутите, чтобы показать добавленный элемент внизу.

В итоге я поставил reloadData в viewWillAppear:animated: и scrollToRowAtIndexPath:... в viewDidAppear:animated:.

// Note: Member variables dataHasChanged and scrollToLast have been
// set to YES somewhere else, e.g. when tapping 'Save' in the new-item view.

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    if (dataHasChanged) {
        self.dataHasChanged = NO;
        [[self tableView] reloadData];
    } else {
        self.scrollToLast = NO; // No reload -> no need to scroll!
    }
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    if (scrollToLast) {
        NSIndexPath *scrollIndexPath = [NSIndexPath indexPathForRow:([dataController count] - 1) inSection:0];
        [[self tableView] scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
    }
}

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

6 голосов
/ 04 апреля 2012

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

[tableviewname setContentOffset:CGPointMake(0, ([arrayofcontact count]-10)*cellheight) animated:YES];

10 - сколько клеток вы хотите прокрутить вверх

Надеюсь, это поможет вам: -)

1 голос
/ 19 января 2017

Анимация прокрутки неизбежна, если смещение установлено от viewDidAppear(_:). Лучшее место для установки начального смещения прокрутки - viewWillAppear(_:). Вам нужно будет принудительно настроить макет табличного представления, потому что размер его содержимого не определен в этой точке.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    tableView.setNeedsLayout()
    tableView.layoutIfNeeded()

    if let selectedIndexPath = selectedIndexPath, tableView.numberOfRows(inSection: selectedIndexPath.section) > 0 {
        tableView.scrollToRow(at: selectedIndexPath, at: .top, animated: false)
    }
}
0 голосов
/ 05 января 2009

Достаточно ли добавить фиктивные контакты для проверки прокрутки? Кажется, что только когда ваш tableView имеет определенный размер, iPhone находит ввод для прокрутки.

Это код, который работает для меня в моем проекте. Я использую предыдущую кнопку и, следовательно, прокручиваю вид таблицы немного ниже, чтобы он обычно шел с UITABLEVIEWSCROLLPOSITION. (Моя предыдущая кнопка не будет работать, если она не может "видеть" предыдущую ячейку.

Игнорировать некоторые вызовы пользовательских методов.

- (void)textFieldDidBeginEditing:(UITextField *)textField {

    //Show the navButtons
    [self navButtonAnimation];


    DetailsStandardCell *cell = (DetailsStandardCell *)textField.superview.superview.superview;

    self.parentController.lastCell = cell;


    //Code to scroll the tableview to the previous indexpath so the previous button will work. NOTE previous button only works if its target table cell is visible.
    NSUInteger row = cell.cellPath.row;
    NSUInteger section = cell.cellPath.section;

    NSIndexPath *previousIndexPath = nil;


    if (cell.cellPath.row == 0 && cell.cellPath.section != 0) //take selection back to last row of previous section
    {
    NSUInteger previousIndex[] = {section -1, ([[self.sections objectForKey:[NSNumber numberWithInt:section - 1]]count] -1)};
    previousIndexPath = [[NSIndexPath alloc] initWithIndexes:previousIndex length:2];   
    }
    else if (cell.cellPath.row != 0 && cell.cellPath.section != 0)
    {
        NSUInteger previousIndex[] = {section, row - 1};
        previousIndexPath = [[NSIndexPath alloc] initWithIndexes:previousIndex length:2];       

    }


    [self.theTableView scrollToRowAtIndexPath: cell.cellPath.section == 0 ? cell.cellPath : previousIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

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