Schaltfläche in benutzerdefinierten UITableViewCell reagiert nicht in iOS 7

8

Dies ist mehr oder weniger eine Fortsetzung dieses Beitrags: Button in UITableViewCell antwortet nicht unter iOS 7

Ich habe genau das gleiche Problem und habe jeden Vorschlag im Thread ausprobiert. Offensichtlich besitze ich diese Frage nicht, also kann ich sie nicht bearbeiten, um mehr Informationen zu geben, und deshalb schreibe ich jetzt diese Frage!

Problem:

Ich habe eine VC-Nib, die ich einlade, die eine Tabellenansicht darin hat, dass ich die Größe abhängig davon ändere, wie viele Zeilen darin sind. Jede Zeile wird aus einer benutzerdefinierten uitableviewcell-Unterklasse mithilfe einer NIB-Datei erstellt. Diese Klasse / Feder hat 4 Knöpfe. Ich kann diesen Code jetzt in iOS 6 oder iOS 8 laden und es funktioniert perfekt. Ich habe kein iOS 7-Gerät, also bin ich an den Simulator gebunden, der bei 7.1 ist (das ist die Version, von der ich vermute, dass der Benutzer, der dieses Problem gemeldet hat, auch verwendet hat, da es heute war). Jetzt im Simulator und auf dem Telefon des Benutzers kann ich alle anderen Elemente auf dieser VC berühren / anklicken, mit Ausnahme der Schaltflächen in den Zellen. Es ist so, als hätten sie UserInteractionEnabled auf NEIN gesetzt, aber das tun sie nicht und es gibt auch keine ihrer Elternansichten (wie ich bald darauf eingehen werde).

Versuchte Lösungen:

- Erstellen Sie die Feder von Grund auf neu und verwenden Sie nicht das automatische Layout

- Aufruf von [self.contentView addSubview:button] in awakeFromNib der Zellklasse

- Erneutes Hinzufügen der Schaltflächen zur contentView zur Laufzeit mit [self.contentView addSubView:button]

-Habe viermal sichergestellt, dass jede Ansicht in der Hierarchie, die ich zu diesen Schaltflächen führen kann, userInteractionEnabled auf YES gesetzt hat. (einschließlich, aber nicht beschränkt auf die Tabellenansicht selbst, die Zelle, das contentView und wenn ich eine "Elternansicht" zu den Schaltflächen hinzufügte, die auch eingestellt wurden)

- Es wurde versucht, alle Schaltflächen mit einer übergeordneten Ansicht anzuheben, die nur die Schaltflächen

enthält

-Alle Schaltflächen befinden sich oben (visuell unten) des Ereignisstapels (hinzufügen und entfernen sind die anderen beiden Schaltflächen):

- Hat die Tabellenzellenauswahl von "single" auf "none" gesetzt.

-Ich übertreibe nicht layoutSubviews in meiner Zellklasse

- Ich kann keine Ansichten außerhalb der Inhaltsansicht verschieben, da der Interface Builder sie komplett aus der Zelle herausnimmt, wenn ich das tue.

- Ich habe versucht, die userInteractionEnabled bei nur der ContentView zur Laufzeit ohne Änderung zu deaktivieren

- Ich habe versucht, den Zellenerstellungscode der Tabellenansicht [cell bringSubviewToFront:cell.button]; für die verschiedenen Schaltflächen auf das gleiche Ergebnis anzuwenden.

Hoffentlich hilfreiche Fakten:

- Ich habe versucht, alle Hintergrundfarben aller Ansichten in der Hierarchie auf verschiedene Farben zu setzen, damit ich sie zur Laufzeit visuell debuggen konnte ... sie sah genauso aus wie erwartet. Keine Überlappungen oder Beläge. (Dies wurde auf nur Ansichten in der Zelle beschränkt)

- Hier sind alle Einstellungen für das TableView:

- Ich habe versucht, dies im neuen XCode 6 zu laden, um den visuellen Debugger zu verwenden, aber der mitgelieferte 7.1-Simulator hat den Code perfekt ausgeführt, damit ich ihn debuggen konnte ...

- Hier ist der Code aus der Warteschlange im VC:

%Vor%

- Hier ist der Code in der viewDidLoad der VC, um die Zellenspitze mit der Tabelle einzurichten (es ist 2, weil dies die von Grund auf ist):

%Vor%

-Alle Verbindungen wurden über IB hergestellt. Diese verwenden alle IBAction oder IBOutlet.

- Ich habe NSLog -Anweisungen in allen Button-Methoden, um zu testen, ob sie tatsächlich aufgerufen werden, aber ich habe auch mit Breakpoints getestet. Alle werden niemals beim Testen ausgelöst.

: Die folgenden TableView-Delegaten- oder Datenquellenmethoden sind wie folgt implementiert:

%Vor%

-Auf Vorschlag habe ich Revel dazu gebracht und festgestellt, dass ein Mystery UILabel und UIImageView in der Ansicht waren .... aber wie ihr sehen könnt sind ihre Frames nur Nullen, also sollten sie nicht reinkommen den Weg von irgendetwas zurück zu dem, wo wir waren, fürchte ich:

UILabelrahmen:

UIImageView-Rahmen:

IIRC Ich habe dies als Simulator-Bug vorher gezählt, aber da es auf dem Gerät des Benutzers passiert, muss es ein tatsächliches Problem sein und es hält meine Pipeline hoch, so dass Hilfe sehr geschätzt werden würde! Danke im Voraus!

PS Ich freue mich, was auch immer zu posten, aber wegen all der Verschiebung im Debugging wusste ich nicht genau, was die Leute sehen wollten, und ich wollte diesen Beitrag nicht überladen, weil ich wusste, dass es passieren würde lang mit allem anderen.

    
Matthew Clark 31.07.2014, 04:27
quelle

9 Antworten

3

Also war das Problem anscheinend diese Codezeilen (im diff-Format von meiner git diff-Ausgabe):

%Vor%

und

%Vor%

so yeah ... scheint, dass in iOS7 +, wenn Sie die "alten" Ausgabetypen für diese Datenquelle-Methoden haben, wird es gut aussehen, aber bork Ihre Tabellenansicht funktional ... gute Zeiten, aber hey es ist jetzt behoben ^^ hoffentlich dies hilft anderen.

    
Matthew Clark 07.08.2014, 11:08
quelle
1

Ich würde vermuten, dass ein Problem mit Ihrer benutzerdefinierten UITableViewCell-Unterklasse NiTGroupTimeCell oder mit den IBAction-Verbindungen von der nib zur Unterklasse tableViewCell besteht.
Ich frage mich auch über die extra leere UILabel und UIImageView. Sie klingen wie die Standardeigenschaften, die in UITableViewCell.h, UIImageView *imageView und UILabel *textLabel deklariert sind. Die Tatsache, dass sie instanziiert werden (und nicht null sind), könnte ein Hinweis auf das seltsame, unerwartete Verhalten sein, das Sie sehen Haben Sie IBOutlets für die UIButtons? Was ist mit dem Ändern von Eigenschaften (in Code) für die Schaltflächen (z. B. Hintergrundfarbe), um sicherzustellen, dass sie tatsächlich in NiTGroupTimeCell beibehalten werden.

    
race_carr 04.08.2014 00:47
quelle
0

Sie sagen, dass Sie [self.contentView addSubview: button] versucht haben, aber Ihre Schaltfläche in Ihrem ersten Bild befindet sich in einer Ansicht in contentView. Versuchen Sie, ein IBOutlet mit dieser Ansicht zu verknüpfen, und versuchen Sie dann [nameOfView addSubview];

    
iOSAaronDavid 04.08.2014 21:49
quelle
0

Werfen Sie eine wilde Vermutung, wie es aussieht, als hätten Sie so ziemlich alles andere abgedeckt.

Du hast gesagt:

  

Ich lade, das hat eine Tabellenansicht darin, dass ich die Größe basierend darauf ändere, wie viele Zeilen drin sind

Und du hast einen Screenshot gepostet, der besagt, dass clip subviews auf der UITableView

deaktiviert ist

Setzen Sie den Rahmen der Tabellenansicht falsch, aber zeigt er trotzdem die Zellen an, weil die Unteransichten nicht abgeschnitten sind?

Laden Sie reveal erneut und überprüfen Sie die Höhe von UITableView

    
William George 05.08.2014 00:13
quelle
0

Nicht sicher, ob das hier der Fall ist. Wenn Sie jedoch die benutzerdefinierten Zellenausgänge imageView , textLabel oder eine der integrierten Eigenschaften von " UITableViewCell " benennen, erhalten Sie seltsame Ergebnisse und Verhaltensweisen.

    
Rivera 05.08.2014 05:56
quelle
0

Sie müssen einige Dinge überprüfen:

  1. Stellen Sie sicher, dass für alle übergeordneten Ansichten der Schaltfläche User Interaction aktiviert ist.
  2. Überprüfen Sie AutoSizing im Größeninspektor und stellen Sie sicher, dass die Schaltfläche innerhalb der Ansicht liegt, sodass Touch-Ereignisse empfangen werden können. Andernfalls werden Touch-Ereignisse ignoriert. Sie können es überprüfen, indem Sie die Farbe der Ansicht ändern. Ändern der Farbe oder NSLog Der Rahmen der Schaltflächen- und Parent-Ansichten hilft Ihnen bei der Fehlerbehebung, falls dies das Problem ist.
  3. Versuchen Sie, die Dinge einfacher zu machen und nicht addSubView programmatisch, wenn Sie aus IB entwerfen.
  4. Stellen Sie sicher, dass eine Komponente die Schaltfläche nicht mit einer clearColor Hintergrundfarbe überlappt.
NeverHopeless 05.08.2014 06:11
quelle
0

Was für mich funktionierte ist das:

%Vor%

Ich habe dies aufgerufen, nachdem ich meine benutzerdefinierte Zelle aus dem Nib / Storyboard geladen habe. Ohne dass userinteractionEnabled auf NO gesetzt ist, haben meine Tasten irgendwie nicht auf Berührungen reagiert. Mein contentView hat alle Berührungen erhalten und nicht an meine Buttons weitergeleitet.

Ich habe Code wo

gesehen %Vor%

wurde als Workaround verwendet, für mich hat es das Problem nicht gelöst.

    
Alexander 06.08.2014 06:35
quelle
0

Ich hatte ein simillar Problem, indem ich Custom Acions basierend auf den Guestures hinzufügte.

Ich habe in Runtime in der Klasse Inherited von UITableViewCell Action Button hinzugefügt Das Verhalten war, wenn ich Schaltflächen außerhalb des sichtbaren Rechtecks ​​hinzufügte, nachdem ich Knöpfe innen animiert hatte, konnte ich nicht klicken / klopfen. Aber in meinem Fall war ich in der Lage, zu tippen / klicken, wenn Schaltflächen im sichtbaren Rechteck hinzugefügt wurden.

Was für mich funktioniert hat, habe ich diese Schaltflächen in View anstelle von ContentView von UITableViewCell hinzugefügt, dann animierte nur Content View. Sie können etwas similar versuchen

- Vishal

    
Vishal Kardode 06.08.2014 06:45
quelle
0

Sie haben gesagt, dass es keine TouchRecognizer (TapRecognizers?) gibt, aber ich denke, Sie sollten das überprüfen und nicht nur nach Touch-Recognizern suchen, sondern nach allen Recognizern im Controller, die diese Zelle verwenden, sogar zu self. Ansicht / Tabellenansicht. Ich habe kürzlich versucht, herauszufinden, warum Zellen nicht auswählen (Delegierte Methode wurde nicht aufgerufen), nur um herauszufinden, dass ich 2 Gestenerkenner hinzugefügt habe (im Code waren diese für andere Dinge notwendig, aber ich musste das tun auf andere Weise), die die Zellauswahl verhindern würde.

Auch das Zeichen dafür kann sein, dass wenn Sie den Knopf lang genug halten (setzen Sie dort einen Haltepunkt, damit Sie es einfacher machen können), wird die Aktion ausgelöst.

    
Timur Kuchkarov 06.08.2014 08:35
quelle

Tags und Links