1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

NSTableView (delegate, datasource)

Dieses Thema im Forum "OS X-Developer" wurde erstellt von Poljpocket, 13.04.08.

  1. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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:' !!!
     
  2. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    Ist den myTableView auch mit dem TableView im Nib initialisiert?

    MacApple
     
  3. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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!!
     
  4. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    Das heißt, myTableView ist ein Outlet, welches Du im Interface Builder mit dem NSTableView-Objekt im Fenster verbunden hast?

    MacApple
     
  5. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    07.01.07
    Beiträge:
    432
  6. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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...
     
  7. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    An welcher Stelle setzt Du denn Datasource und Delegate? In -awakeFromNib?

    MacApple
     
  8. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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!!)
     
  9. Peter Maurer

    Peter Maurer Carmeliter-Renette

    Dabei seit:
    16.03.04
    Beiträge:
    3.274
    Und wo steht das -reloadData? So, wie's dasteht, kann's nicht funktionieren. (Oder ist das in -installControllers versteckt?)
     
  10. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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... :(
     
  11. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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!)
     
  12. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    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? ;)
     
  13. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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 :)
     
  14. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    Ich sage dazu if-Bedingung. Eine Schleife wird wiederholt durchlaufen, eine if-Bedingung nur einmal, außer sie befindet sich innerhalb einer Schleife.

    MacApple
     
  15. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    07.01.07
    Beiträge:
    432
    screen1.jpg

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

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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
     
  17. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    Wenn Du jetzt noch die Implementierung von CADocumentWindowController zeigen könntest...

    MacApple

    Edit: hat sich dann wohl erledigt.
     
  18. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Die Bedingung steht in den runden Klammern. Dieses Konstrukt heiß Verzweigung.

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

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    Jo, da hast Du recht. Da muss ich meine Ausdrucksweise auch umstellen. :)

    MacApple
     

Diese Seite empfehlen