Pergunta

Eu tenho um aplicativo que funciona alguns que semelhante à forma como a aplicação de Contato de iPhone funciona. Quando adicionar um novo usuário Contactar é dirigido para uma visão única tela com informações de contato. Se seleccionar "Todos os contactos" na barra de navegação, o usuário é navegado à lista de todos os contatos, onde o contato adicionado recentemente está em vista.

Podemos mover a vista para uma linha específica usando:

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

... mas ele não está funcionando. Eu estou chamando esse direito após a chamada:

    [tableView reloadData];

Eu acho que eu não estou supor para chamar o método selectRowAtIndexPath:animated:scrollPosition aqui. Mas se não aqui, então onde?

Existe algum método delegado que é chamado após o método a seguir?

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
Foi útil?

Solução

Eu acho que eu tenho um aplicativo semelhante:.. Uma lista de item, toque em '+' -> nova tela, voltar e ver a lista atualizada, rolado para mostrar o item adicionado na parte inferior

Em resumo, eu coloquei reloadData em viewWillAppear:animated: e scrollToRowAtIndexPath:... em 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];
    }
}

Espero que isso ajude. Se você adicionar algo no meio da lista, você pode facilmente rolar para essa posição em seu lugar.

Outras dicas

Você pode tentar isso, o meu pedido em algum tipo de semelhante a você quando eu clicar em um botão de rolagem de uitableview é para cima.

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

10 é para quantas células você quer rolar para cima

Espero que isso irá ajudá-lo: -)

Rolando animação é inevitável quando o deslocamento é definido a partir viewDidAppear(_:). Um lugar melhor para a criação de rolagem inicial offset é viewWillAppear(_:). Você vai precisar para forçar o layout de uma vista de tabela, porque é o tamanho do conteúdo não está definido nesse ponto.

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)
    }
}

Você tem bastante contatos fictícios adicionado para testar a rolagem? Parece que só quando o seu tableView é de um certo tamanho do iPhone encontra o inputus a rolagem.

Este é o código que funciona para mim no meu projeto. Eu uso um botão anterior e, portanto, eu rolar o tableview um pouco mais abaixo que normalmente iria com UITABLEVIEWSCROLLPOSITION. (Meu botão anterior não vai funcionar se ele não pode "ver" a célula anterior.

Ignorar algumas das chamadas de método personalizado.

- (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];

}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top