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:
undtableView:cellForRowAtIndexPath:
mit der neuen Unterklasse - Ziehen
UITableViewController
auf der obersten Ebene der bestehenden XIB im InterfaceBuilder, löschen Sie dieUIView
/UITableView
werden automatisch erstellt für dieseUITableViewController
einstellen und dann dieUITableViewController
's Klasse, um mit den neuen Unterklasse - Entfernen, die zuvor bei arbeiten
UITableView
's bestehendendataSource
unddelegate
verbindungen und schließen Sie Sie an die neueUITableViewController
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 ichtableView: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 eineUITableView
auf die vorgesehene view-Oberfläche. - Verbinden Sie die
UITableView
'sdataSource
unddelegate
-Filialen auf den File' s Owner, der sollte schon darstellen, dieTableTestViewController
-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 derUITableView
- Nun, zu versuchen, zu bewegen, diese
UITableView
's Logik in eine separate Klasse erstellen Sie zuerst eine neue Datei in Xcode, die WahlUITableViewController
Unterklasse und ruft die KlasseTableTestTableViewController
- Entfernen Sie die obigen code-snippet aus
TableTestViewController.m
und legen Sie es inTableTestTableViewController.m
ersetzen Sie die Standardimplementierung dieser drei Methoden mit den unsrigen. - Zurück im Interface Builder in der gleichen
TableTestViewController.xib
-Datei, ziehen Sie eineUITableViewController
in die main-IB-Fenster und löschen Sie die neueUITableView
Objekt, das automatisch die mit ihm kamen - Legen Sie die Klasse für diese neue
UITableViewController
zuTableTestTableViewController
- Entfernen Sie die
dataSource
unddelegate
Bindungen von der vorhandenen, zuvor arbeitenUITableView
und wieder die gleichen zwei Bindungen zu den neuenTableTestTableViewController
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.
InformationsquelleAutor der Frage Adam Alexander | 2008-10-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich folgte Ihre Schritte, neu die Projekt-und lief in das gleiche problem. Im Grunde sind Sie fast da. Es gibt 2 Dinge, die fehlen (mal fester, es funktioniert):
Müssen Sie den
tableView
desTableTestTableViewController
zu denUITableView
Sie auf dem Bildschirm haben. Wie ich schon sagte, weil es nichtIBOutlet
können Sie überschreiben dietableView
Eigenschaft und machen es undIBOutlet
:Nächste Sache ist, fügen Sie einen Verweis auf die
TableTestTableViewController
und bewahren Sie Sie in derTableTestViewController
. Ansonsten wird IhrTableTestTableViewController
freigesetzt werden können (nach dem laden der nib-mit nichts hängen.) und das ist, warum Sie sehen die unzuverlässige Ergebnisse, Abstürze oder nichts zeigt. Das zu tun, fügen Sie hinzu:und eine Verbindung, die in den Interface Builder, um die
TableTestTableViewController
Instanz.Mit den oben genannten dies funktionierte gut auf meinem Rechner.
Ich denke auch, es wäre gut, um die motivation dahinter (statt nur über die
UITableViewController
mit seinen eigenenUITableView
). In meinem Fall war es andere Ansichten, die nur dieUITableView
auf der gleichen vollen Bildschirm Inhalt. Also ich kann hinzufügen, andereUILabels
oderUIImages
unterUIView
und zeigen Sie dasUITableView
unter Ihnen oder über Ihnen.InformationsquelleAutor der Antwort keremk
Ich habe gerade viele Stunden damit verbracht, mein Haar ziehen, um herauszufinden, warum ein
UITableView
würde nicht zeigen, bis, wenn, wenn ich es hatte eingebettet in eine separate Feder, anstatt in der main-Spitze. Schließlich fand ich Eure Diskussion oben und erkannte, dass es war, weil meinUITableViewController
war nicht zurückgehalten! Anscheinend ist der delegate und datasource-Eigenschaften desUITableView
werden nicht markiert, "behalten" und so ist meine Feder laden aber der controller wurde geworfen... Und durch die Wunder von objective-c hab ich keine Fehlermeldungen, bei allen aus dieser... ich verstehe immer noch nicht, warum es nicht zum Absturz. Ich weiß, dass ich gesehen habe "- Nachricht veröffentlicht xxx" vor... warum heißt es nicht dass Sie mir einer von denen?!?Ich denke, die meisten Entwickler würden davon ausgehen, dass die Struktur, die Sie bauen in einem interface builder würde gehalten werden, in einigen größeren Kontext (die Feder) und unterliegt nicht der Veröffentlichung. Ich glaube, ich weiß, warum Sie das tun.. damit kann das iPhone löschen und neu laden Teile der Feder auf den niedrigen Speicher. Aber Mann, das war schwer herauszufinden.
Kann mir jemand sagen wo ich gelesen habe, dass das Verhalten in den docs?
Auch - über das anschließen der anzeigen. Erstens, wenn Sie ziehen Sie aus dem UI builder Sie sehen, dass Sie hook up die view-Eigenschaft (die ein
IBOutlet
), um die Tabelle anzuzeigen. Es ist nicht notwendig, zu entlarventableView
, scheint man intern festgelegt. In der Tat ist es nicht einmal notwendig erscheint, um die Ansicht einzustellen, es sei denn, Sie wollenviewDidLoad
Benachrichtigung. Ich habe gerade gebrochen, die Sicht-Verbindung zwischen meinemuitableview
unduitableviewcontroller
(nur delegate und datasource gesetzt) und es ist anscheinend gut funktioniert.InformationsquelleAutor der Antwort Pat Niemeyer
Ja für einige Grund (bitte läuten wenn jemand weiß, warum...)
tableView
Eigenschaft desUITableViewController
ist nicht ausgesetzt, wie einIBOutlet
obwohl es eine öffentliche Eigenschaft. So, wenn Sie Interface Builder, können Sie nicht sehen, dass Immobilien, die für die Verbindung zu Ihrem anderenUITableView
. Also in der Unterklasse, erstellen Sie einetableView
gekennzeichnete Eigenschaft alsIBOutlet
und verbinden.Scheint all dies hacky und eine Lösung für mich, aber es scheint die einzige Möglichkeit zu sein zu trennen, eine
UITableViewController's
UITableView
und legen Sie es irgendwo anders im UI-Hierarchie. Ich lief in das gleiche Problem, als ich versuchte, Sie in die Entwurfsansicht, wo gibt es andere Dinge als dieUITableView
und so habe ich es gelöst... Ist das der richtige Ansatz???InformationsquelleAutor der Antwort keremk
War ich in der Lage, diese Arbeit zu machen. Ich baute ein wirklich schönes dashboard mit 4 TableViews und eine webview mit video. Der Schlüssel wird mit der separaten tableView-Controller und die IBOutlets zu den anderen tableview-Controller in der Ansicht definierten controller. In UIB müssen Sie nur schließen Sie das andere tableview-Controller, um die Datei, die Eigentümer des view-Controllers. Verbinden Sie dann die Tabellen, um die entsprechende view-Controller für die datasource und delegate.
InformationsquelleAutor der Antwort user589642