2012-04-03 11 views
21

Mit Storyboard, statische Zellen, in cellForRowAtIndexPath: die LinieStoryboard statische Zellen: dequeueReusableCellWithIdentifier nil

UITableViewCell *cell = 
    [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

immer nil zurückgibt.

Ich habe folgendes geprüft:

  • Kennung der Zelle richtig eingestellt ist in IB/Storyboard und ich verwende den gleichen Bezeichner im Code. Ich habe das viele Male überprüft.
  • Ich habe den View-Controller nicht an anderer Stelle instanziiert (das war das Problem in this stackoverflow question).

My-View-Controller eine Unterklasse von UITableViewController ist natürlich, eingewickelt in einen Ad-hoc- Navigation-Controller in Storyboard. Ich vermute, dass mein View-Controller irgendwie nichts über die im Storyboard definierten Zellen-IDs weiß, da es sich um eine andere Instanz handeln könnte. Hier ist der Code, der ihn "instanziiert". In prepareForSegue: verwende ich

CustomViewController *vc = [[[segue destinationViewController] 
    viewControllers] objectAtIndex:0]; 

Weitere Anpassungen des View-Controllers hier getan (Einstellung Eigenschaften etc.) funktioniert gut.

Ich verwende statische Zellen, weil die Anzahl der Abschnitte und Zeilen nicht ändert, und jede Zelle enthält statischen Text (und andere Steuerelemente oder Textfelder zum Bearbeiten).

Es scheint mir, dies ist eine sehr häufige Aufgabe (anpassen statischer Zellen aus Storyboard in den Datenquellen Methoden des View-Controllers). Was mache ich falsch?

+0

Sie müssen uns zeigen, wo Sie die benutzerdefinierte Zelle erstellen. Das ist der wichtige Teil. – borrrden

+0

Ich erstelle die benutzerdefinierte Zelle im Storyboard. Geben Sie "Benutzerdefiniert" und eine eigene Zellenkennung ein. Funktioniert es nicht so? – Mundi

+0

Ich habe den ganzen statischen Teil verpasst. Statische Zellen werden vollständig im Storyboard entworfen. siehe Teil 2 dieses hervorragenden Tutorials www.raywenderlich.com/5191/beginning-storyboards-in-ios-5-part-2 – borrrden

Antwort

44

Mit statischem Inhalt in einer Tabellenansicht implementieren Sie keine der Datenquellenmethoden (einschließlich tableView:cellForRowAtIndexPath:, so dass Sie die Zellen nie aus der Warteschlange entfernen würden. Es gibt keine Warteschleifen für statische Inhalte (an denen Sie sich beteiligen können) .

Wenn Sie einen Zeiger auf eine bestimmte Zelle erhalten möchten:

  • es aus der Tabellenansicht erhalten cellForRowAtIndexPath: mit:

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    
  • haben Sie eine Steckdose für die spezifische Zelle und passen Sie sie direkt an.

  • Iterate durch die Zellen und überprüfen Sie die reuseIdentifier Eigenschaft die Zelle, die Sie interessiert sind zu bekommen.

Alle diese Dinge können in viewWillAppear oder ähnlich erfolgen.

Wenn Sie in Ihren Zellen einen ganz anderen Inhalt haben wollen als auf dem Storyboard, dann sind statische Zellen wahrscheinlich nicht die richtige Wahl. Sie sollten dynamische Prototypen (beachten Sie, dass Sie mehrere Prototypen im Storyboard haben können) stattdessen mit den traditionellen Datenquellenmethoden verwenden.

+0

Danke - also für das, was ich tun möchte, scheint es, dass ich wirklich Prototypzellen verwenden muss. Könnten Sie das zu Ihrer Antwort hinzufügen, damit ich es überprüfen kann? Danke für Ihre Klarstellungen! – Mundi

+0

Bearbeitete meine Antwort, du hast nicht wirklich gesagt, was du versucht hast, also hoffe es hilft! – jrturton

+0

Ich versuche, in einigen Zellen statische Titelbeschriftungen und editierbare Textfelder zu haben, und in anderen einige andere Steuerelemente. Ich dachte, du kannst Daten dynamisch in statische Zellen eintragen. Die Anzahl oder Position der Zellen ändert sich nicht. Ich habe angefangen, es mit Prototypzellen zu machen, und es ist so viel Arbeit - fast schlimmer als vor dem Storyboard! – Mundi

0

Die Lösung bestand darin, Prototypzellen anstelle von statischen Zellen zu verwenden. Ich gebe den Scheck immer noch an @jrturton, da er der Erste war, der mir die Idee gebracht hat.

Ein weiterer interessanter Fehler, den ich gerade gelöst habe: Mit Prototyp Zellen vom Typ "Custom", wenn Sie versuchen, cell.textLabel mit Text zu füllen, wird es einfach automatisch funktionieren, aber alle anderen Subviews verhalten sich sehr seltsam. Ich benutze jetzt einfach mein benutzerdefiniertes Label und alles funktioniert einwandfrei.

Prost, vielen Dank für Ihre Hilfe.

+0

Wie haben Sie "Custom" Cell verwendet? weil dequeueReusableCellWithIdentifier nil zurückgibt? –

+0

Sie können "Benutzerdefiniert" in Interface Builder angeben. – Mundi

+0

Ich habe Custom in Interface Builder angegeben, dann habe ich die UITableViewCell subclassiert und ihr diese Zelle zugewiesen. Aber es bringt leere dynamische Zellen. –

0

Anders als in der Antwort oben,

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

wird nicht funktionieren. Aber die erwähnte Methode, um einen Ausgang zum cell selbst zu schaffen, arbeitet.

Es ist auch möglich, Ansichten wie UIButtons oder UITextFields auf dem cell zu platzieren und für diese auch Steckdosen zu haben.

Beide Methoden können auch in Kombination verwendet werden. Z.B. Stellen Sie cell.textLabel.text für eine bestimmte Zelle ein und haben Sie ein anderes Steuerelement, auf das über die Steuerausgänge zugegriffen wird.

0

Im Storyboard können die statischen Zellen die Methoden im <UITableViewDataSource> Protokoll NICHT implementieren.

Sie könnten also die Methoden verwenden, die in <UITableViewDelegate> enthalten sind.

0

Sie können immer noch dataSource/Delegate-Methoden von statischen UITableView verwenden, müssen Sie einfach nicht erstellen neue Zellen.

Wenn Sie Zellen mit Datasource Methoden zu ändern, innerhalb cellForRowAtIndexPath::

UITableViewCell * cell = [super tableView:tableView cellForRowAtIndexPath:indexPath]; 

und starten Sie dann Zelle zu modifizieren.

Verwandte Themen