Ich habe einen Ansichts-Controller mit einer Tabellenansicht und einer separaten Schreibfeder für die Tabellenzellenvorlage. Die Zellenvorlage enthält einige Schaltflächen. Ich möchte auf den Schaltflächenklick zusammen mit dem Index der Zelle zugreifen, auf die im Ansichts-Controller geklickt wurde, in dem ich die Tabellenansicht definiert habe.
Also ich habe ViewController.h
und ViewController.m
wo ich das UITableView
und TableTemplate.h
, TableTemplate.m
und TableTemplate.xib
wo ich die Spitze definiert haben. Ich möchte das Button-Click-Ereignis mit dem Zellenindex in ViewController.m
.
Hilfe, wie kann ich das machen?
quelle
Delegierte sind der richtige Weg.
Wie bei anderen Antworten zu sehen, kann die Verwendung von Ansichten veraltet sein. Wer weiß, dass es morgen möglicherweise einen anderen Wrapper gibt, der möglicherweise verwendet werden muss
cell superview]superview]superview]superview]
. Und wenn Sie Tags verwenden, erhalten Sie am Ende n Bedingungen für die Identifizierung der Zelle. Um all dies zu vermeiden, richten Sie Delegierte ein. (Auf diese Weise erstellen Sie eine wiederverwendbare Zellenklasse. Sie können dieselbe Zellenklasse als Basisklasse verwenden und müssen lediglich die Delegatmethoden implementieren.)Zuerst benötigen wir eine Schnittstelle (Protokoll), die von der Zelle verwendet wird, um Tastenklicks zu kommunizieren (zu delegieren). ( Sie können eine separate .h-Datei für das Protokoll erstellen und sowohl in den Tabellenansichts-Controller als auch in benutzerdefinierte Zellenklassen aufnehmen ODER sie einfach in eine benutzerdefinierte Zellenklasse einfügen, die ohnehin in den Tabellenansichts-Controller aufgenommen wird. )
Fügen Sie dieses Protokoll in den benutzerdefinierten Controller für Zellen- und Tabellenansichten ein. Stellen Sie sicher, dass der Table View Controller dieses Protokoll bestätigt.
Erstellen Sie in einer benutzerdefinierten Zelle zwei Eigenschaften:
UIButton
Klicken Sie im IBAction-Delegat auf: (Dasselbe kann für jede Aktion in einer benutzerdefinierten Zellenklasse durchgeführt werden, die zurück delegiert werden muss, um den Controller anzuzeigen. )cellForRowAtIndexPath
Legen Sie in der Tabellenansicht-Steuerung nach dem Entfernen der Zelle die obigen Eigenschaften fest.Und implementieren Sie den Delegaten in Table View Controller:
Dies wäre der ideale Ansatz, um benutzerdefinierte Aktionen für Zellenschaltflächen im Table View Controller abzurufen.
quelle
Anstatt mit Tags zu spielen, habe ich einen anderen Ansatz gewählt. Delegierter für meine Unterklasse von UITableViewCell (OptionButtonsCell) gemacht und eine indexPath-Variable hinzugefügt. Über meine Schaltfläche im Storyboard habe ich @IBAction mit der OptionButtonsCell verbunden und dort eine Delegatenmethode mit dem richtigen indexPath an alle Interessierten gesendet. In der Zelle für den Indexpfad habe ich den aktuellen Indexpfad festgelegt und es funktioniert :)
Lassen Sie den Code für sich selbst sprechen:
Swift 3 Xcode 8
OptionButtonsTableViewCell.swift
MyTableViewController.swift
quelle
class MyTableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, OptionButtonsDelegate
Können Sie mir helfen, ich erhalte Fehler in dieser Zeile: // Fehler: Redundante Konformität von 'MyTableViewController' mit dem Protokoll 'UITableViewDataSource'Dies sollte helfen: -
Hier ist der Absender die UIButton-Instanz, die das Ereignis sendet. myTableView ist die UITableView-Instanz, mit der Sie sich befassen.
Stellen Sie einfach die richtige Zellreferenz ein und die ganze Arbeit ist erledigt.
Möglicherweise müssen Sie die Schaltflächen aus der Inhaltsansicht der Zelle entfernen und sie direkt zur UITableViewCell-Instanz als Unteransicht hinzufügen.
Oder
Sie können ein Tag-Namensschema für verschiedene UIButtons in cell.contentView formulieren. Mit diesem Tag können Sie später die Zeilen- und Abschnittsinformationen nach Bedarf kennen.
quelle
Der folgende Code könnte Ihnen helfen.
Ich habe
UITableView
mit benutzerdefinierten Prototyp Zellklasse imUITableViewCell
Inneren genommenUIViewController
.Also ich habe
ViewController.h
,ViewController.m
undTableViewCell.h
,TableViewCell.m
Hier ist der Code dafür:
ViewController.h
ViewController.m
Benutzerdefinierte Zellenklasse:
und
Hinweis : Hier habe ich alle
UIControls
mit Storyboard aufgenommen.Hoffe das kann dir helfen ... !!!
quelle
Der Grund, warum ich die folgende Technik mag, weil sie mir auch hilft, den Tabellenabschnitt zu identifizieren.
Schaltfläche in Zelle hinzufügen cellForRowAtIndexPath:
Ereignis addTask:
Hoffe diese Hilfe.
quelle
Verwenden Sie Swift-Verschlüsse:
quelle
Taruns Code funktioniert unter iOS7 nicht, da sich die UITableViewCell-Struktur geändert hat und er stattdessen "UITableViewCellScrollView" erhalten würde.
Dieser Beitrag UITableViewCell mit Superview in iOS 7 abrufen bietet eine gute Lösung zum Erstellen einer Schleife, um die richtige übergeordnete Ansicht zu finden, unabhängig von zukünftigen Änderungen in der Struktur. Es läuft darauf hinaus, eine Schleife zu erstellen:
Der Link enthält Code für eine wiederverwendbarere Lösung, dies sollte jedoch funktionieren.
quelle
Swift 2.2
Sie müssen ein Ziel für diese Schaltfläche hinzufügen.
Funktionsname: verbunden // zum Beispiel
Und natürlich müssen Sie das Tag dieser Schaltfläche festlegen, da Sie sie verwenden.
Sie können dies erreichen, indem Sie UITableViewCell unterklassifizieren. Verwenden Sie es im Interface Builder, legen Sie eine Schaltfläche in dieser Zelle ab, verbinden Sie es über eine Steckdose und los geht's.
So erhalten Sie das Tag in der verbundenen Funktion:
quelle
Swift 3 mit einem Verschluss
Eine gute Lösung ist die Verwendung eines Abschlusses in einer benutzerdefinierten UITableViewCell, um eine Aktion an den viewController zurückzurufen.
In der Zelle:
In View Controller: Tableview Delegate
quelle
Ich finde es am einfachsten, die Schaltfläche in Ihrer Zelle zu unterordnen (Swift 3):
In Ihrer Zellklasse:
Geben Sie in der Datenquelle der Tabellenansicht oder Sammlungsansicht beim Deaktivieren der Zelle der Schaltfläche ihren Indexpfad:
Sie können diesen Code also einfach in Ihren Table View Controller einfügen:
Und vergessen Sie nicht, die Klasse der Schaltfläche in Ihrem Interface Builder festzulegen und mit der
handleTapOnCellInfoButton
Funktion zu verknüpfen !bearbeitet:
Verwenden der Abhängigkeitsinjektion. So richten Sie den Aufruf einer Schließung ein:
und fügen Sie den Abschluss in die willDisplay-Methode des Delegaten der Sammlungsansicht ein:
quelle
Seine Arbeit für mich.
quelle
quelle
für schnell 4:
quelle
Wenn Sie den Parameterwert mithilfe von Closure von der Zelle an UIViewController übergeben möchten, dann
quelle
Die @ Mani-Antwort ist gut, jedoch werden Tags von Ansichten in der Inhaltsansicht der Zelle häufig für andere Zwecke verwendet. Sie können stattdessen das Tag der Zelle (oder das contentView-Tag der Zelle) verwenden:
1) Weisen Sie in Ihrer
cellForRowAtIndexPath:
Methode das Tag der Zelle als Index zu:2) Fügen Sie wie folgt Ziel und Aktion für Ihre Schaltfläche hinzu:
3) Erstellen Sie eine Methode, die die Zeile des Absenders zurückgibt (danke @Stenio Ferreira):
4) Codeaktionen basierend auf dem Index:
quelle
CustomTableCell.h ist eine UITableViewCell:
MyVC.m nach dem Import:
In "cellForRowAtIndexPath" in MyVC.m:
MyVC.m:
quelle
quelle