2015-09-21 4 views
9

Ich habe eine benutzerdefinierte UITableViewCell Unterklasse, die ein paar IBAction Methoden von einer Feder verdrahtet enthält.IBAction innerhalb UITableViewCell nicht in iOS 9

Unter iOS 8 funktioniert alles wie erwartet. Wenn der Benutzer eine der Tasten antippt, wird das entsprechende IBAction aufgerufen. Wenn der Benutzer irgendwo anders auf die Zelle tippt, wird UITableView didSelectRowAtIndexPath aufgerufen.

Unter iOS 9 werden meine IBAction-Methoden nie aufgerufen. Die UITableViewdidSelectRowAtIndexPath wird immer ausgelöst, unabhängig davon, wo der Benutzer in der Zelle (Schaltfläche oder nicht) tippt.

Das Projekt ist unter Xcode 6/Swift 1.2 kompiliert.

Ich fand diesen Beitrag in einem Apple-Forum ohne Lösung. Sie scheinen das gleiche Problem zu haben.

https://forums.developer.apple.com/thread/16179

Antwort

22

dachte ich die Lösung aus, hoffentlich diese Antwort jemand anderes die Zeit sparen.

Ich erbte diese Codebasis und es gab einige Probleme. Die UITableViewCell's, die unter iOS 9 nicht funktionierten, verwendeten UITableViewCell Nibs w/a ContentView nicht. Stattdessen hatte jemand eine UIView Feder erstellt und dann auf eine benutzerdefinierte UITableViewCell Unterklasse verwiesen. Die Nibs hatten keine ContentView und anscheinend ist iOS 9 etwas wählerischer. Diese Implementierung funktionierte unter iOS 8 gut und es gab keine Compiler- oder Laufzeitfehler oder Warnungen.

Die Lösung war, eine neue UITableViewCell Unterklasse zu erstellen und Xcode automatisch die Feder dafür erstellen lassen. Dann kopierte ich die gesamte Benutzeroberfläche und den Code aus der alten Schreibfeder und fügte sie in die ContentView der neuen Schreibfeder ein. Ich musste dann die Einschränkungen beheben und die Verbindungen zur benutzerdefinierten Unterklasse neu verkabeln.

+6

Oder fügen Sie einfach UITableViewCell aus der Objektbibliothek in der gleichen XIB-Datei hinzu, copypaste/relayout/relink IBOutlets/set-Basisklasse, dann alte Ansicht entfernen. – jki

+1

Danke dafür! Wirklich frustrierend. –

+1

Vielen Dank für das Teilen. Ich habe meinen ganzen Tag damit verbracht, bis ich deine Antwort sah. – user3144836

3

fügen Sie einfach diese Zeile in tableViewCellForRowAtIndexPath Methode

cell.contentView.userInteractionEnabled = false; 
return cell; 

aber dies ist nicht eine richtige Lösung.

iOS 9, stellt eine Inhaltsansicht in eine TabelleView-Zelle, obwohl Sie eine benutzerdefinierte Zelle/Xib verwenden. Die Inhaltsansicht wurde nach der benutzerdefinierten Zelle hinzugefügt. Sie befand sich darüber.

Um dies richtig zu lösen, ersetzen Sie die Ansicht von benutzerdefinierten Zellen/xib durch UITableviewCell aus der Objektbibliothek [von wo Sie normalerweise ziehen & Drop UIButton, UILable, etc ...];

+0

Dies ist eine ausgezeichnete Lösung, wenn Sie eine schnelle Lösung benötigen. Ich verwendete ein Drittanbieter-Framework, das nicht mehr funktionierte. Ich musste lediglich die Benutzerinteraktionen in der Inhaltsansicht deaktivieren. Ich tat dies in initWithCoder (es war eine Nib-Datei). –