Wie komme ich aus einer Zelle indexPath
in eine UITableView
?
Ich habe nach Stapelüberlauf und Google gesucht, aber alle Informationen sind umgekehrt. Gibt es eine Möglichkeit, auf das superView
/ zuzugreifen UITableView
und dann nach der Zelle zu suchen?
Weitere Informationen zum Kontext: Ich habe zwei Klassen, eine heißt Cue
und eine heißt CueTableCell
(eine Unterklasse von UITableViewCell
) CueTableCell
ist die visuelle Darstellung von Cue
(beide Klassen haben Zeiger aufeinander). Cue
Objekte befinden sich in einer verknüpften Liste, und wenn der Benutzer einen bestimmten Befehl ausführt, muss die visuelle Darstellung (der CueTableCell
) des nächsten Cue
ausgewählt werden. Die Cue
Klasse ruft also die select
Methode für die nächste Cue
in der Liste auf, die die UITableView
von der abruft cell
und ihre aufruft selectRowAtIndexPath:animated:scrollPosition:
, für die sie die indexPath
von benötigt UITableViewCell
.
UITableView
aus einer Zelle - warum? Dies scheint ein Codegeruch einer schlechten Entwurfsentscheidung zu sein - es gibt nicht viele legitime Anwendungsfälle für eine Zelle, um zu wissen, ob es sich um indexPath handelt oder ob es auf dem Bildschirm angezeigt wird oder nicht.Antworten:
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
Es hilft beim Lesen der UITableView-Dokumentation , auch wenn dies von einigen als kontrovers angesehen wird (siehe Kommentare unten).
Die Zelle hat kein Geschäft damit, ihren Indexpfad zu kennen. Der Controller sollte Code enthalten, der UI-Elemente basierend auf dem Datenmodell manipuliert oder Daten basierend auf UI-Interaktionen ändert. (Siehe MVC .)
quelle
Versuchen Sie dies mit Ihrer UITableViewCell:
NSIndexPath *indexPath = [(UITableView *)self.superview indexPathForCell: self];
BEARBEITEN: Scheint unter iOS 8.1.2 und höher nicht zu funktionieren. Vielen Dank an Chris Prince für den Hinweis.
quelle
Sie können diesen einfachen Tipp ausprobieren:
in deiner
UITableViewCell
Klasse:@property NSInteger myCellIndex; //or add directly your indexPath
und zu Ihrer
cellForRowAtIndexPath
Methode:... [cell setMyCellIndex : indexPath.row]
Jetzt können Sie Ihren Zellenindex überall abrufen
quelle
Um diejenigen anzusprechen, die sagen "das ist eine schlechte Idee" , muss ich in meinem Fall einen Knopf auf meinem haben
UITableViewCell
, der beim Drücken einen Übergang zu einer anderen Ansicht darstellt. Da dies keine Auswahl in der Zelle selbst ist,[self.tableView indexPathForSelectedRow]
funktioniert dies nicht.Dies lässt mir zwei Möglichkeiten:
NSFetchedResultsController
weil ich nicht alle Objekte im Speicher speichern möchte, insbesondere wenn die Tabelle lang ist.NSIndexPath
durch einen Hack herausfinden muss , aber es ist letztendlich billiger als das Speichern von Objekten im Speicher.indexPathForCell:
ist die richtige Methode, aber hier ist, wie ich es machen würde (es wird angenommen, dass dieser Code in einer Unterklasse von implementiert istUITableViewCell
:// uses the indexPathForCell to return the indexPath for itself - (NSIndexPath *)getIndexPath { return [[self getTableView] indexPathForCell:self]; } // retrieve the table view from self - (UITableView *)getTableView { // get the superview of this class, note the camel-case V to differentiate // from the class' superview property. UIView *superView = self.superview; /* check to see that *superView != nil* (if it is then we've walked up the entire chain of views without finding a UITableView object) and whether the superView is a UITableView. */ while (superView && ![superView isKindOfClass:[UITableView class]]) { superView = superView.superview; } // if superView != nil, then it means we found the UITableView that contains // the cell. if (superView) { // cast the object and return return (UITableView *)superView; } // we did not find any UITableView return nil; }
PS Mein echter Code greift über die Tabellenansicht auf all dies zu, aber ich gebe ein Beispiel dafür, warum jemand so etwas direkt in der Tabellenzelle tun möchte.
quelle
Fügen Sie eine schwache tableView-Eigenschaft wie folgt in die .h-Datei der Zelle ein:
@property (weak,nonatomic)UITableView *tableView;
Weisen Sie die Eigenschaft in der cellForRowAtIndex-Methode wie folgt zu:
cell.tableView = tableView;
Wo immer Sie den Indexpfad der Zelle benötigen:
NSIndexPath *indexPath = [cell.tableView indexPathForCell:cell];
quelle
Für schnell
let indexPath :NSIndexPath? = (self.superview.superview as! UITableView)?.indexPathForCell(self)
quelle
Die Antwort auf diese Frage hat mir sehr geholfen.
ich benutzte
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
Das war
sender
in meinem Fall einUITableViewCell
und kommt von derprepareForSegue
Methode.Ich habe das benutzt, weil ich kein hatte ,
TableViewController
aber ich hatteUITableView property outlet
Ich musste den Titel des herausfinden
Cell
und daher den Indexpfad davon kennen.Hoffe das hilft jedem!
quelle
Unter iOS 11.0 können Sie Folgendes verwenden
UITableView.indexPathForRow(at point: CGPoint) -> IndexPath?
:if let indexPath = tableView.indexPathForRow(at: cell.center) { tableView.selectRow (at: indexPath, animated: true, scrollPosition: .middle) }
Es erhält den Mittelpunkt der Zelle und dann gibt die Tabellenansicht den Indexpunkt zurück, der diesem Punkt entspricht.
quelle
Versuchen Sie dies (es funktioniert nur, wenn die tableView nur einen Abschnitt hat und alle Zellen die gleiche Höhe haben):
//get current cell rectangle relative to its superview CGRect r = [self convertRect:self.frame toView:self.superview]; //get cell index int index = r.origin.y / r.size.height;
quelle
Versuchen Sie dies mit Ihrer UITableViewCell:
NSIndexPath *indexPath = [(UITableView *)self.superview.superview indexPathForCell:self];
quelle
Um Zugang zu meiner Zelle zu erhalten, habe ich Folgendes getan:
Ich habe eine Erweiterung des UIView:
extension UIView { var parentViewController: UIViewController? { var parentResponder: UIResponder? = self while parentResponder != nil { parentResponder = parentResponder!.next if let viewController = parentResponder as? UIViewController { return viewController } } return nil } }
Und dann .. in meiner Zelle Klasse:
class SomeCell: UITableViewCell { func someMethod() { if let myViewController = self.parentViewController as? CarteleraTableViewController { let indexPath : IndexPath = (myViewController.tableView).indexPath(for: self)! print(indexPath) } } }
Das ist alles von mir.
Freundliche Grüße.
quelle