2009-07-13 6 views
0

Ich habe benutzerdefinierte UITableViewCell aus Code eingerichtet. In meiner Zelle habe ich einen "UITableViewCellAccessoryDisclosingIndicator". Wenn die Zelle hervorgehoben wird, wird sie blau und das Zubehörelement wird weiß. Das ist alles gut.cell.accessoryType verschwindet Problem

Wenn jedoch eine neue Ansicht angetippt wird, verschwindet das Zubehörelement. Wenn ich zurück zur Tabellenansicht gehe, ist der UITableViewCellAccessoryDisclosureIndicator nicht mehr vorhanden und wenn ich den Finger auf dieselbe Zelle klicke/halte, wird er nicht mehr markiert.

Es funktionierte letzte Woche gut, aber ich kann einfach nicht herausfinden, was dieses Problem plötzlich ausgelöst hat. Ich kann nichts sehen, wenn ich ein "hg diff" mache, also habe ich gehofft, dass jemand mich zu einer möglichen Lösung führen würde. Wenn Sie einen bestimmten Code benötigen, lassen Sie es mich wissen.

Ich habe Atebits Fast Scrolling Beispielcode verwendet und eine Menge Anpassung mit ihm gemacht, aber die Grundlagen (und hervorgehoben BOOL) ist gleich geblieben.

PS. In meinem Code habe ich auch bemerkt, dass die UITableViewCell nicht hervorgehoben bleibt, wenn die neue Ansicht gedrückt wird. Ich habe bemerkt, dass Apples eigenen Beispiel-Code, die Zelle markiert ist, wenn die neue Ansicht gedrückt wird, und zurück in die Tabellenansicht die Zelle bleibt hervorgehoben, bis die Tabellenansicht den ganzen Weg zurück an ihren Platz geschoben wird. Irgendwelche Ideen hier? Danke.

Antwort

0

Ich bin mir nicht sicher, was der Fast Scrolling-Code ist, auf den Sie sich beziehen, aber die Tabellenansichtszelle sollte hervorgehoben bleiben, indem Sie den View-Controller drücken und loslassen und die Auswahl sofort nach dem nächsten Controller aufheben. Mit anderen Worten sollte die Abfolge der Ereignisse sein:

  1. Erhalten Berührungsereignis auf einer Tabellenansicht Zelle
  2. Die Zelle wählt (Highlights blau)
  3. Schieben Sie den neuen Controller
  4. Jede Aktion (en) auf den neuen Controller Pop
  5. den neuen Controller
  6. die Zelle abgewählt (Blendungen von blau zu weiß)

Wenn dies für Sie nicht der Fall ist, rufen Sie wahrscheinlich die UITableView-Methode deselectRowAtIndexPath:animated: auf - dies ist die Methode, die für die programmgesteuerte Deaktivierung von Zellen in einer Tabellenansicht zuständig ist. Stellen Sie sicher, dass Sie keine zusätzlichen Aufrufe für diese Methode in Ihrem Code haben.

Was die disclousre Indikator zu verlieren, stellen Sie sicher, dass Ihre Datenquelle des Tabellenansicht nicht während eines Push oder Pop eines View-Controller ändert. Wenn sich die Datenquelle in ein anderes Objekt ändert, das keinen UITableViewCellAccessoryDisclosureIndicator in den generierten Zellen enthält, wird dies nicht angezeigt, wenn Sie die Tabelle durch Drücken/Öffnen einer Ansicht aktualisieren, selbst wenn diese Zelle hervorgehoben ist. (Es kann diagnostisch vorteilhaft sein, die Tabelle anzuzeigen, eine kleine Weile warten, dann [tableView reloadData] anrufen und sehen, ob Ihr Zubehör Indikatoren verschwinden.)

+0

Ich fügte hinzu: - (void) viewWillAppear: (BOOL) animiert { NSIndexPath * selectedRowIndexPath = [self.tableView indexPathForSelectedRow]; if (selectedRowIndexPath! = Nil) { [self.tableView deselectRowAtIndexPath: selectedRowIndexPath animiert: YES]; } } Jetzt ist der DisclosureIndicator etwas in Ordnung. Es wird zurückgegeben, wenn die Zellenauswahl aufgehoben oder die Tabellenansicht verschoben wird. Die Zeile wird jedoch immer noch abgewählt, wenn die neue Ansicht gedrückt wird. Ich möchte die Wirkung von "welche Zelle wurde besucht" bekommen, damit die Zelle hervorgehoben bleibt. Auch wenn die Ansicht gedrückt wird, verschwindet das Offenlegungselement während der Animation immer noch :( – runmad

+0

Ich bin mir nicht sicher, ob Sie wirklich Aufrufe von deselectRowAtIndexPath hinzufügen sollten: animated :, aber anstatt sie zu entfernen - haben Sie diese Methode schon irgendwo aufgerufen ? Wenn nicht, können wir in Ihrer App relevanten Code sehen (wie Ihre Implementierungen für tableView: didSelectRowAtIndexPath: und andere navigationsrelevante Delegate-Methoden)? – Tim

1

ich einfach dieses Problem für mich gelöst (dies AM)

Versuche, für Argument, um die LayoutSubviews-Methode aus Ihrer Zelle zu entfernen. Ich habe festgestellt, dass dies bei Accessory Views Chaos anrichtet. Am Ende habe ich diese Methode aus meinen Zellen entfernt und die Elemente in der Initialisierungsmethode positioniert.

+0

Ich habe keine LayoutSubviews-Methode in meinem Code: / – runmad

0

Wenn Sie außer Kraft setzen "layoutSubviews" benötigen Sie

[super layoutSubviews]; 

vor Ihrer benutzerdefinierten Layout Sachen zu nennen.