UITableView-Problem bei Verwendung separater Delegate / dataSource

Allgemeine Beschreibung:

Beginnen mit, was funktioniert ich habe ein UITableView wurde, platziert auf einem Xcode-generierte Ansicht über den Interface Builder. Die Ansicht der Datei-Besitzer ist auf eine Xcode-generierte Unterklasse von UIViewController. Zu dieser Unterklasse, die ich Hinzugefügt haben zu arbeiten Implementierungen von numberOfSectionsInTableView: tableView:numberOfRowsInSection: und tableView:cellForRowAtIndexPath: und der Ansicht Tabelle ist dataSource und delegate sind die mit dieser Klasse verbunden über den Eigentümer der Datei im Interface Builder.

Den oben genannten Konfiguration funktioniert ohne Probleme. Das Problem tritt auf, wenn ich mich bewegen will, diese Tabelle Ansicht dataSource und delegate-Implementierungen heraus in eine separate Klasse, die meisten wahrscheinlich, weil es andere Steuerelemente in der Ansicht neben der Tabelle angezeigt und ich würde gerne verschieben Sie die Tabelle Anzeigen-code aus seiner eigenen Klasse. Um dies zu erreichen, versuche ich die folgende:

  • Erstellen Sie eine neue Unterklasse von UITableViewController in Xcode
  • Bewegen Sie die bekannt-gute Implementierungen von numberOfSectionsInTableView:, tableView:numberOfRowsInSection: und tableView:cellForRowAtIndexPath: mit der neuen Unterklasse
  • Ziehen UITableViewController auf der obersten Ebene der bestehenden XIB im InterfaceBuilder, löschen Sie die UIView/UITableView werden automatisch erstellt für diese UITableViewController einstellen und dann die UITableViewController's Klasse, um mit den neuen Unterklasse
  • Entfernen, die zuvor bei arbeiten UITableView's bestehenden dataSource und delegate verbindungen und schließen Sie Sie an die neue UITableViewController

Wenn Sie fertig sind, ich habe keine Arbeit UITableView. Ich Ende mit einem von drei Ergebnissen, die können scheinbar zufällig zufällig:

  • , Wenn die UITableView lädt, bekomme ich einen runtime error, der angibt, sende ich tableView:cellForRowAtIndexPath: ein Objekt, das erkennt Sie nicht
  • , Wenn die UITableView lädt, das Projekt bricht in den debugger ohne Fehlermeldung
  • Es gibt keine Fehler, aber die UITableView nicht angezeigt

Mit einigen debugging und erstellt einen basic-Projekt, nur um dieses Problem zu reproduzieren, ich bin in der Regel zu sehen, die 3. option von oben (kein Fehler aber auch keine sichtbaren Tabellen-Ansicht). Ich habe einige NSLog Anrufe und festgestellt, dass, obwohl numberOfSectionsInTableView: und numberOfRowsInSection: sind beide immer genannt, cellForRowAtIndexPath: ist nicht. Ich bin überzeugt, ich bin etwas fehlt wirklich einfach und hoffte, die Antwort mag offensichtlich sein, jemand mit mehr Erfahrung als ich haben. Wenn dies nicht eine einfache Antwort würde ich mich freuen zu aktualisieren, mit etwas code oder ein Beispiel Projekt. Vielen Dank für Ihre Zeit!

Schritte zum reproduzieren:

  • Erstellen Sie ein neues iPhone OS, View-Based Application in Xcode und nennen es TableTest
  • Öffnen TableTestViewController.xib im Interface Builder und ziehen Sie eine UITableView auf die vorgesehene view-Oberfläche.
  • Verbinden Sie die UITableView's dataSource und delegate-Filialen auf den File' s Owner, der sollte schon darstellen, die TableTestViewController-Klasse. Speichern Sie Ihre änderungen
  • Zurück in Xcode, fügen Sie den folgenden code, um TableTestViewController.m:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    NSLog(@"Returning num sections");
    return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSLog(@"Returning num rows");
    return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"Trying to return cell");
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }
    cell.text = @"Hello";
    NSLog(@"Returning cell");
    return cell;
}
  • Bauen und Gehen, und Sie sollten sehen, das Wort Hello erscheinen in der UITableView
  • Nun, zu versuchen, zu bewegen, diese UITableView's Logik in eine separate Klasse erstellen Sie zuerst eine neue Datei in Xcode, die Wahl UITableViewController Unterklasse und ruft die Klasse TableTestTableViewController
  • Entfernen Sie die obigen code-snippet aus TableTestViewController.m und legen Sie es in TableTestTableViewController.m ersetzen Sie die Standardimplementierung dieser drei Methoden mit den unsrigen.
  • Zurück im Interface Builder in der gleichen TableTestViewController.xib-Datei, ziehen Sie eine UITableViewController in die main-IB-Fenster und löschen Sie die neue UITableView Objekt, das automatisch die mit ihm kamen
  • Legen Sie die Klasse für diese neue UITableViewController zu TableTestTableViewController
  • Entfernen Sie die dataSource und delegate Bindungen von der vorhandenen, zuvor arbeiten UITableView und wieder die gleichen zwei Bindungen zu den neuen TableTestTableViewController wir erstellt haben.
  • Speichern Sie die änderungen, zu Bauen und zu Gehen, und wenn Sie bekommen die Ergebnisse, die ich bekomme, beachten Sie die UITableView funktioniert nicht mehr richtig

Lösung:
Mit etwas mehr Problemlösung und etwas Hilfe von den iPhone-Entwickler-Foren, ich habe dokumentiert eine Lösung! Die wichtigsten UIViewController Unterklasse des Projekts muss eine Steckdose Hinweis auf die UITableViewController Instanz. Um dies zu erreichen, fügen Sie einfach den folgenden, um die primäre Ansicht header (TableTestViewController.h):

#import "TableTestTableViewController.h"

und

IBOutlet TableTestTableViewController *myTableViewController;

Dann im Interface Builder verbinden Sie das neue outlet vom File ' s Owner zu TableTestTableViewController im Haupt-IB Fenster. Es sind keine änderungen notwendig, das UI-Teil der XIB. Einfach die Steckdose an Ort und Stelle, auch wenn keine Benutzer-Codes direkt verwendet, und behebt das problem vollständig. Danke an alle, die geholfen haben, und Kredit geht zu BaldEagle auf der iPhone Developer-Foren für die Suche nach der Lösung.

Kommentar zu dem Problem
Können Sie uns die Quelle dieser Lösungen? Ich kann nicht follow-up mit denen........ noch. Kommentarautor: Eddie

InformationsquelleAutor der Frage Adam Alexander | 2008-10-31

Schreibe einen Kommentar