2015-07-09 1 views
9

Sto tentando di rendere visibile l'ultima riga in un UITableView, dopo che è stata aggiunta. In questo momento, quando aggiungo una riga e chiamo reloadData, la tabella va in cima.UITableView indexPath dell'ultima riga

Immagino che se ottengo il indexPath per l'ultima riga, posso selezionare quella riga e dovrebbe apparire nell'elenco. Non sono sicuro di come ottenere quel valore, o anche se mi sto avvicinando correttamente.

Come si ottiene un indexPath per una riga specifica?

+0

dopo l'uso reload ** - (void) tableView: (UITableView *) tableView willDisplayCell: (UITableViewCell *) delle cellule forRowAtIndexPath: (NSIndexPath *) indexPath ** –

+0

** NSIndexPath ** è una combinazione di sectionIndex e rowIndex che puoi rendere ** NSIndexPath ** passando questi due valori. Ecco un esempio: ** [NSIndexPath indexPathForRow: rowIndex inSection: sectionIndex]; **. Nel tuo caso rowIndex è * arrayCount-1 *. – TheTiger

+0

Anche per la visibilità dell'ultima riga è possibile impostare ** offset tabellaView y coordinata **. Impostalo ** (contentSizeHeight-tableHeight) ** ti mostrerà fino all'ultima riga. Esempio: ** [tblView setContentOffset: CGPointMake (0.0, tblView.contentSize.height - CGRectGetHeight (tblView.frame)) animato: SÌ]; ** .... Sto rispondendo in commento perché non voglio dare un risposta duplicata. – TheTiger

risposta

20

Si prega di notare che, non è necessario chiamare il reloadData per rendere visibile l'ultima riga. È possibile utilizzare il metodo scrollToRowAtIndexPath.

È possibile utilizzare il codice qui sotto per raggiungere il tuo obiettivo.

// First figure out how many sections there are 
let lastSectionIndex = self.tblTableView!.numberOfSections() - 1 

// Then grab the number of rows in the last section 
let lastRowIndex = self.tblTableView!.numberOfRowsInSection(lastSectionIndex) - 1 

// Now just construct the index path 
let pathToLastRow = NSIndexPath(forRow: lastRowIndex, inSection: lastSectionIndex) 

// Make the last row visible 
self.tblTableView?.scrollToRowAtIndexPath(pathToLastRow, atScrollPosition: UITableViewScrollPosition.None, animated: true) 
0

Non utilizzare -reloadData per questo caso d'uso. Quello che stai cercando è -insertRowsAtIndexPaths:withRowAnimation:.

Non esitate a chiedere se volete alcuni esempi di utilizzo o una spiegazione più dettagliata sul motivo per cui l'utilizzo di -reloadData vi invia all'inizio dello UITableView.

+0

Voglio eseguire un'azione su una cella appena inserita, Come garantire che la cella sia stata creata? Perché il recupero della cella in quell'indicePath mi sta dando 'nil' –

1

Come suggerito da altri ottenere indexPath per le sezioni perticular come sezione 0.

Dopo quella chiamata ... aggiungere questo Methos in cellFOrROwAtIndex

[tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; ..per scorrere fino indexPath specifica a Tableview.

Nota: -Ma è ancora necessario scorrere la vista tabella in direzione verso il basso.

0

Non richiesto obbligatoriamente per ottenere il percorso dell'indice dell'ultima riga.
È possibile impostare il CGPoint di Uitableview per mostrare un'ultima riga aggiunta.
Uso sempre questo codice nella mia applicazione di chat per mostrare un ultimo messaggio aggiunto.

//Declaration 
@IBOutlet weak var tableview: UITableView! 

//Add this executable code after you add this message. 
var tblframe: CGRect = tableview.frame 
tblframe.size.height = self.view.frame.origin.y 
tableview.frame = tblframe 
var bottomoffset: CGPoint = CGPointMake(0, tableview.contentSize.height - tableview.bounds.size.height) 
if bottomoffset.y > 0 { 
    tableview.contentOffset = bottomoffset; 
} 

Spero che funzioni per voi.
Grazie.

1

È possibile utilizzare scrollToRowAtIndexPath con l'estensione:

In Swift 3:

extension UITableView { 
    func scrollToLastCall(animated : Bool) { 
     let lastSectionIndex = self.numberOfSections - 1 // last section 
     let lastRowIndex = self.numberOfRows(inSection: lastSectionIndex) - 1 // last row 
     self.scrollToRow(at: IndexPath(row: lastRowIndex, section: lastSectionIndex), at: .Bottom, animated: animated) 
    } 
}