Leider wird diese Methode nur aufgerufen, wenn der interne Schaltflächentyp, der bei Verwendung eines der vordefinierten Typen angegeben wird, getippt wird. Um Ihr eigenes Zubehör zu verwenden, müssen Sie Ihr Zubehör als Schaltfläche oder andere UIControl-Unterklasse erstellen (ich würde die Verwendung einer Schaltfläche empfehlen-buttonWithType:UIButtonTypeCustom
und das Bild der Schaltfläche festzulegen, anstatt eine UIImageView zu verwenden).
Hier sind einige Dinge, die ich in Outpost verwende, wodurch die Standard-Widgets so angepasst werden (nur geringfügig, dass sie unserer blaugrünen Farbe entsprechen), dass ich meine eigene UITableViewController-Zwischenunterklasse erstellt habe, um den Dienstprogrammcode für alle anderen zu verwendenden Tabellenansichten zu speichern (sie sind jetzt Unterklassen) OPTableViewController).
Erstens gibt diese Funktion mithilfe unserer benutzerdefinierten Grafik eine neue Schaltfläche zur Offenlegung von Details zurück:
- (UIButton *) makeDetailDisclosureButton
{
UIButton * button = [UIButton outpostDetailDisclosureButton];
[button addTarget: self
action: @selector(accessoryButtonTapped:withEvent:)
forControlEvents: UIControlEventTouchUpInside];
return ( button );
}
Die Schaltfläche ruft diese Routine auf, wenn sie fertig ist, und speist dann die Standardroutine UITableViewDelegate für zusätzliche Schaltflächen:
- (void) accessoryButtonTapped: (UIControl *) button withEvent: (UIEvent *) event
{
NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: [[[event touchesForView: button] anyObject] locationInView: self.tableView]];
if ( indexPath == nil )
return;
[self.tableView.delegate tableView: self.tableView accessoryButtonTappedForRowWithIndexPath: indexPath];
}
Diese Funktion lokalisiert die Zeile, indem sie die Position in der Tabellenansicht einer Berührung aus dem von der Schaltfläche bereitgestellten Ereignis abruft und die Tabellenansicht an diesem Punkt nach dem Indexpfad der Zeile fragt.
self.tableView
. Was ist, wenn Sie nicht wissen, welche Tabellenansicht die Zeile enthält?Ich fand diese Website sehr hilfreich: Benutzerdefinierte Zubehöransicht für Ihre uitableview in iphone
Kurz gesagt, verwenden Sie dies in
cellForRowAtIndexPath:
:Implementieren Sie dann diese Methode:
quelle
Mein Ansatz besteht darin, eine
UITableViewCell
Unterklasse zu erstellen und die Logik zu kapseln, die die üblicheUITableViewDelegate
Methode darin aufruft.quelle
button.superview
,cell.superview
und[tableView.delegate tableView:...]
ist nicht sicher genug.Eine Erweiterung der obigen Antwort von Jim Dovey:
Seien Sie vorsichtig, wenn Sie einen UISearchBarController mit Ihrem UITableView verwenden. In diesem Fall möchten Sie überprüfen
self.searchDisplayController.active
und verwendenself.searchDisplayController.searchResultsTableView
stattself.tableView
. Andernfalls erhalten Sie unerwartete Ergebnisse, wenn der searchDisplayController aktiv ist, insbesondere wenn die Suchergebnisse gescrollt werden.Beispielsweise:
quelle
Definieren Sie ein Makro für Tags von Schaltflächen:
Erstellen Sie die Schaltfläche und legen Sie beim Erstellen einer Zelle die cell.accessoryView fest
Legen Sie cell.accessoryView.tag von indexPath in der UITableViewDataSource-Methode -tableView: cellForRowAtIndexPath fest:
Ereignishandler für Schaltflächen
Implementieren Sie die UITableViewDelegate-Methode
quelle
tag
sei denn, wenn dies unbedingt erforderlich ist, suchen Sie nach einer anderen Lösung.Wenn Sie auf die Schaltfläche tippen, kann die folgende Methode in einer UITableViewCell-Unterklasse aufgerufen werden
quelle
Mit yanchenko Ansatz musste ich hinzufügen:
[accBtn setFrame:CGRectMake(0, 0, 20, 20)];
Wenn Sie die xib-Datei zum Anpassen Ihrer tableCell verwenden, wird initWithStyle: reuseIdentifier: nicht aufgerufen.
Überschreiben Sie stattdessen:
quelle
Sie müssen a verwenden
UIControl
, um den Ereignisversand (z. B. aUIButton
) ordnungsgemäß zu erhalten, anstatt einfachUIView/UIImageView
.quelle
Swift 5
Bei diesem Ansatz wird der
UIButton.tag
indexPath mithilfe der grundlegenden Bitverschiebung gespeichert. Der Ansatz funktioniert auf 32- und 64-Bit-Systemen, solange Sie nicht mehr als 65535 Abschnitte oder Zeilen haben.quelle
Ab iOS 3.2 können Sie die von anderen hier empfohlenen Schaltflächen vermeiden und stattdessen Ihr UIImageView mit einer Tippgestenerkennung verwenden. Stellen Sie sicher, dass die Benutzerinteraktion aktiviert ist, die in UIImageViews standardmäßig deaktiviert ist.
quelle