it-swarm.com.de

iOS - Wie kann ich den IndexPath des letzten Elements in einer Tabellenansicht erhalten?

Ich möchte automatisch zum Ende einer Tabellenansicht blättern.

[tableView scrollToRowAtIndexPath:lastIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

In Anbetracht dessen, dass ich weiß, wie viele Elemente sich in der Tabellenansicht befinden, verwenden Sie:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

Wie kann ich den IndexPath * auf den letzten Eintrag in dieser Tabellenansicht bringen? Dies ist erforderlich, damit ich es als Argument für scrollToRowAtIndexPath: atScrollPosition: animated angeben kann

Vielen Dank!

25
Nick

Sie können den indexPath der letzten Zeile im letzten Abschnitt wie folgt erhalten.

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:(numberOfRowsInLastSection - 1) inSection:(numberOfSections - 1)];

Hier ist numberOfSections der Wert, den Sie von der numberOfSectionsInTableView:-Methode zurückgeben. Und numberOfRowsInLastSection ist der Wert, den Sie von der numberOfRowsInSection:-Methode für den letzten Abschnitt in der Tabellenansicht zurückgeben.

Dies kann in eine Unterklasse oder Kategorie eingefügt werden, um es einfach zu machen:

-(NSIndexPath*)indexPathForLastRow
{
    return [NSIndexPath indexPathForRow:[self numberOfRowsInSection:self.numberOfSections - 1] - 1 inSection:self.numberOfSections - 1];
}
30
EmptyStack

Um einen Verweis auf die letzte Zeile im letzten Abschnitt zu erhalten…

// First figure out how many sections there are
NSInteger lastSectionIndex = [tableView numberOfSections] - 1;

// Then grab the number of rows in the last section
NSInteger lastRowIndex = [tableView numberOfRowsInSection:lastSectionIndex] - 1;

// Now just construct the index path
NSIndexPath *pathToLastRow = [NSIndexPath indexPathForRow:lastRowIndex inSection:lastSectionIndex];
31
Ryan Grimm

In Swift 3

let lastRowIndex = tableView.numberOfRows(inSection: tableView.numberOfSections-1)

if (indexPath.row == lastRowIndex - 1) {
     print("last row selected")
}
10
Omer Janjua

Wahrscheinlich wird jemand dasselbe für UICollectionView, Brauchen, also habe ich Ryan Grimm s Antwort dafür aktualisiert:

NSInteger lastSectionIndex = [self.collectionView numberOfSections] - 1;
NSInteger lastItemIndex = [self.collectionView numberOfItemsInSection:lastSectionIndex] - 1;
NSIndexPath *pathToLastItem = [NSIndexPath indexPathForItem:lastItemIndex inSection:lastSectionIndex];
9
Shmidt

Hier ist eine Erweiterung in Swift 4.x , die berücksichtigt, dass möglicherweise keine Zeilen vorhanden sind, sodass Abstürze außerhalb des zulässigen Bereichs vermieden werden.

import UIKit

extension UITableView {
    func lastIndexpath() -> IndexPath {
        let section = max(numberOfSections - 1, 0)
        let row = max(numberOfRows(inSection: section) - 1, 0)

        return IndexPath(row: row, section: section)
    }
}

Dann rufen Sie es von Ihrem Viewcontroller aus mit an:

let lastIndexPath = tableView.lastIndexPath()
7
CodeBender

versuche dies:

In cellForRowAtIndexPath

if(indexPath.row == myArray.count -1)

{
     myIndexPath = indexpath;
}

myIndexPath sollte ein Objekt von NSIndexPath sein

7
Meghan

Die meisten Antworten, einschließlich der akzeptierten Antwort, berücksichtigen nicht die gültigen Fälle einer Tabellensicht mit Nullabschnitten oder eines Endabschnitts mit Nullzeilen. 

Der beste Weg, diese Situationen darzustellen, ist die Verwendung eines Index von NSNotFound, der von UIKit in Methoden wie scrollToRowAtIndexPath:atScrollPosition:animated: akzeptiert wird.

NSNotFound ist ein gültiger Zeilenindex zum Scrollen zu einem Abschnitt mit null Zeilen.

Ich verwende die folgende Methode: 

- (NSIndexPath *)bottomIndexPathOfTableView:(UITableView *)tableView
{
    NSInteger finalSection = NSNotFound;
    NSInteger finalRow = NSNotFound;

    NSInteger numberOfSections = [tableView numberOfSections];
    if (numberOfSections)
    {
        finalSection = numberOfSections - 1;
        NSInteger numberOfRows = [tableView numberOfRowsInSection:finalSection];
        if (numberOfRows)
        {
            finalRow = numberOfRows - 1;
        }
    }
    return numberOfSections ? [NSIndexPath indexPathForRow:finalRow inSection:finalSection] : nil;
}
3

Es scheint, als würden alle Lösungen nicht berücksichtigen, dass der letzte Abschnitt überhaupt keine Zeilen hat. Hier ist eine Funktion, die die letzte Zeile in einem letzten nicht leeren Abschnitt zurückgibt:

Swift 3:

extension UITableViewDataSource {
    func lastIndexPath(_ tableView: UITableView) -> IndexPath? {
        guard let sections = self.numberOfSections?(in: tableView) else { return nil }
        for section in stride(from: sections-1, through: 0, by: -1) {
            let rows = self.tableView(tableView, numberOfRowsInSection: section)
            if rows > 0 {
                return IndexPath(row: rows - 1, section: section)
            }
        }
        return nil
    }
}

Beispiel:

class ViewController: UIViewController {

    //...

    func scrollToLastRow() {
        if let indexPath = lastIndexPath(tableView) {
            tableView.scrollToRow(at: indexPath, at: .bottom, animated: true)
        }
    }
}

extension ViewController: UITableViewDataSource {
    //required data source methods
}
2
alexburtnik

Schnelle 3-Antwort mit Checks außerhalb der Grenzen. Implementiert als Tableview-Erweiterung

extension UITableView {

    var lastIndexPath: IndexPath? {

        let lastSectionIndex = numberOfSections - 1
        guard lastSectionIndex >= 0 else { return nil }

        let lastIndexInLastSection = numberOfRows(inSection: lastSectionIndex) - 1
        guard lastIndexInLastSection >= 0 else { return nil }

        return IndexPath(row: lastIndexInLastSection, section: lastSectionIndex)
    }
}
1
Mark Bridges

Versuchen Sie diesen Code:

//   get number of section
let indexOfLastSection = self.yourTableView.numberOfSections - 1

// Then get the number of rows in the last section

if indexOfLastSection >= 0{
    let indexOfLastRow = self.yourTableView.numberOfRows(inSection: indexOfLastSection) - 1
    if indexOfLastRow >= 0{
        let pathToLastRow = IndexPath.init(row: indexOfLastRow, section: indexOfLastSection)
    }
}
0
Brijesh Shiroya