NSTableView (delegate, datasource)

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Hallo ihr Profis!

Ich habe mal wieder ein Problem! Ich habe versucht ein simples Objekt, das die beiden nötigen Methoden für eine NSTableDataSource implementiert und auch die Daten hält, zur datasource eines NSTableView zu machen, nämlich so in der Art:

Code:
[myTableView setDataSource:myObject];

wobei anObject mein Objekt ist und myTableView das Table View.

Danach schicke ich dem View einen -reloadData und nichts wird passiert, obwohl eigentlich Daten vorhanden sind! Jetzt der Witz: Wenn ich im Interface Builder mein Objekt direkt als dataSource angebe, funktioniert alles!!!! Nochwas: myObject wird ja mittels weak link im View gesetzt, das heisst, es könnte verloren gehen! In meinem Fall ist dies nicht möglich, weil es eine Variable einer anderen Klasse ist, die es dann retaint!

Es ist nicht das erste Mal, dass mir das aufgefallen ist!

Nun meine Frage: Muss ich im Code noch etwas zusätzliches angeben, damit das funktioniert? Resp. muss ich dem TableView noch etwas anderes angeben?

Danke für eure Antworten!!

PS: Das selbe Problem bei '-setDelegate:' !!!
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Ist den myTableView auch mit dem TableView im Nib initialisiert?

MacApple
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Jap, ganz sicher! Wenn ich übers nib die datasource und delegate konfiguriere, funktioniert alles... ich kann dem Objekt ja auch -reloadData senden und es werden dann auch die neuen Daten angezeigt!!
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Das heißt, myTableView ist ein Outlet, welches Du im Interface Builder mit dem NSTableView-Objekt im Fenster verbunden hast?

MacApple
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Ich habe mehrere Projekte, bei denen mir das schon aufgefallen ist, wie gesagt!

Hier ein Beispiel, bei dem ich es fast zwingend über Code machen muss:

Ich habe einen NSWindowController (Subklasse) der das Fenster steuert und in dem sich ein TableView befindet, das als Outlet des Controllers verlinkt ist. Jetzt habe ich eine zweite Klasse, die dafür da ist, die datasource des TableViews zu spielen. Diese wird im beim Initialisieren des WindowControllers mittels alloc/init angelegt. Sobald alles sauber geladen wurde, sendet der WindowController dem TableView: setDelegate:oops:bjekt und -setDataSource:oops:bjekt !! anscheinend reicht das dem TableView nicht aus...
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
An welcher Stelle setzt Du denn Datasource und Delegate? In -awakeFromNib?

MacApple
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Code:
- (void)showWindow:(id)inSender {
        [myTableView setDataSource:myTableDataSource];
        [myTableView setDelegate:myTableDataSource];
	[self installControllers];
	[super showWindow:inSender];
}

(in der WindowController Implementation!!)
 

Peter Maurer

Pommerscher Krummstiel
Registriert
16.03.04
Beiträge
3.077
Und wo steht das -reloadData? So, wie's dasteht, kann's nicht funktionieren. (Oder ist das in -installControllers versteckt?)
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
in -installControllers wird myTableDataSource das tableView übergeben und dieses selber sendet dann -reloadData (sobald es die Daten fertig geholt hat!)

Könnte es sein, dass, wenn ich ein IBOutlet übergebe, da einfach nil übergeben wird?? Habe das ausprobiert im myTableDataSource, mittels einer if-Schleife, falls es nil ist, wird was ausgegeben sonst nicht... wurde leider was ausgegeben... :(
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Aber: Ich habe auch bei anderen Projekten das selbe Problem... bei den meisten ist der windowController selbst die datasource!!! Er sendet den View -setDataSource und gleich danach -reloadData! (Und wie gesagt: Wenn ich mittels Interface Builder die datasourde einstelle, funktioniert alles!)
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Könnte es sein, dass, wenn ich ein IBOutlet übergebe, da einfach nil übergeben wird?? Habe das ausprobiert im myTableDataSource, mittels einer if-Schleife, falls es nil ist, wird was ausgegeben sonst nicht... wurde leider was ausgegeben... :(
Das kann aus zwei Gründen so sein. Entweder Du greifst zu früh auf ein Outlet zu, so dass es noch nicht initialisiert wurde (in awakeFromNib ist es sicher initialisiert) oder falls das Outlet zu einem File's Owner gehört, wurde beim Laden des Nibs ein falscher File's Owner angegeben. Mach am Besten mal ein Beispielprojekt und häng das hier dran.

MacApple

PS. Was ist eine if-Schleife? ;)
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Code:
if ([I]Bedingung[/I]) {
   falls wahr
} else {
   falls falsch
}

<-- Wie sagst Du dem?? Offensichtlich hast Du ja verstanden, was ich meine :)
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Ich sage dazu if-Bedingung. Eine Schleife wird wiederholt durchlaufen, eine if-Bedingung nur einmal, außer sie befindet sich innerhalb einer Schleife.

MacApple
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
screen1.jpg

Sollte wohl alles stimmen, oder? CADocumentWindowController ist der oben genannte windowController
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
phlöde muss man sein... solche Überlegungsfehler passieren mir immer wieder... :(

Ich liess beim Initialisieren des Window-Controllers die DataSource initialisieren und übergab schon da das TableView IBOutlet, welches hier NATÜRLICH noch nil sein muss!!!

Danke für deine Mühe o_O
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Wenn Du jetzt noch die Implementierung von CADocumentWindowController zeigen könntest...

MacApple

Edit: hat sich dann wohl erledigt.
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
Ich sage dazu if-Bedingung. Eine Schleife wird wiederholt durchlaufen, eine if-Bedingung nur einmal, außer sie befindet sich innerhalb einer Schleife.
Die Bedingung steht in den runden Klammern. Dieses Konstrukt heiß Verzweigung.

Und gleich zur Vollständigkeit: Dieses Switch-Case-Default-Konstrukt heiß Mehrfachverzweigung.