Вопрос

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

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

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

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

    [tableView reloadData];

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

Существует ли какой-либо метод делегирования, который вызывается после следующего метода?

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
Это было полезно?

Решение

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

Подводя итог, я хотел бы сказать 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];
    }
}

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

Другие советы

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

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

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

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

Анимация прокрутки неизбежна, когда смещение установлено из 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)
    }
}

Достаточно ли добавить фиктивные контакты для проверки прокрутки? Кажется, что только когда ваш 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];

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top