• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

NSTableView richtig Anwenden?

Der Paule

Königsapfel
Registriert
26.05.07
Beiträge
1.199
Moin,

bin gerade dabei mit Obj-C und Cocoa zu arbeiten. Allerdings komm ich grad mit der NSTableView nicht weiter. Die Beschreibungen dazu, sind meiner Meinung nach recht dürftig.
Meist ohne Erklärungen, schlecht lesbaren und nicht formatierten, seitenweise Quellcode.

Hoffentlich kann mir jemand besser erklären wie TableViews funktionieren und anzuwenden sind. So wie ich verstanden habe muss ich zwei Methoden der TableView einbinden um das ganze überhaupt nutzen zu können. Das wären
Code:
- (int)numberOfRowsInTableView:([URL="http://www.cocoadev.com/index.pl?NSTableView"]NSTableView[/URL] *)tableView

und
Code:
 - (id)tableView:([URL="http://www.cocoadev.com/index.pl?NSTableView"]NSTableView[/URL] *)tableVieobjectValueForTableColumn:([URL="http://www.cocoadev.com/index.pl?NSTableColumn"]NSTableColumn[/URL] *)tableColumn row:(int)row
Die Steuerung und Nutzung der Methoden übernimmt Cocoa? ja selbst. Meine Frage ist jetzt. Wie arbeite ich dann mit der TableView. Wenn ich jetzt z.B. die Methode
Code:
- (void)tableView:([URL="http://www.cocoadev.com/index.pl?NSTableView"]NSTableView[/URL] *)aTableView setObjectValue:(id)anObject[FONT=Arial]
[/FONT]   forTableColumn:([URL="http://www.cocoadev.com/index.pl?NSTableColumn"]NSTableColumn[/URL] *)aTableColumn row:(int)rowIndex

einbinde. Muss ich dann dort nur dem Daten Array ein neues Object verpassen?
Wann wird die Methode denn dann aufgerufen, bzw. wie?
Beim hinzufügen muss die reloadData Methode
von TableView aufgerufen werden damit die neuen
Daten angezeigt werden. Allerdings erhalte ich immer eine Warnung. Die wie folgt aussieht:

attachment.php


Klar keine Fehlermeldung. Allerdings finde ich es merkwürdig das überall, alle die reloadData
Methode nutzen ohne auf eine Warnung hinzuweisen. Oder mach ich was Falsch? Bestimmt.
Ich muss bei jedem Eintrag ein Object meines Modells erstellen und dem Array hinzufügen
und danach ein reloadData ausführen. Richtig?

Ich habe das Beispiel aus dem Buch von Rodewig und Negm-Awad umgesetzt.
Allerdings läuft das Programm nicht. Ich erhalte keine Fehlermeldung oder Warnung.
Es hüpft lediglich das APP Symbol im Dock beim Compilieren und Ausführen des Projekts.

Mein aufbau sieht wie folgt aus. Ich habe ein Fenster mit einem Splitview. In einem View hab ich
eine TableView. Diese bzw. die DataSource habe ich mit meinem Controller verbunden. Ich habe
eine Klasse als Modell für die TableView. Diese enthält einen String mit Getter/Setter Methoden.
Die Klasse Controller enthält sdie beiden ersten Methoden von Oben und das Daten Array. Sowie zwei
Instanzen der Modell Klasse. In der Methode awakeFromNib sollen zwei Objekte dem Array hinzugefügt
werden und in der TableView dargestellt werden.

Hier die Modell Klasse

Code:
@interface clsTableView : NSObject 
{
    NSString *strtbviewItem;
}

@property (retain) NSString *strtbviewItem;

@end

@implementation clsTableView
@synthesize strtbviewItem;
@end

Und hier die Controller Klasse:
Code:
@interface controller : NSObject 
{
    clsTableView *tbvItem_One;
    clsTableView *tbvItem_Two;
    NSMutableArray *maItems;
    IBOutlet NSTabView *tbView;
}

-(int)numberOfRowsInTableView:(NSTableView *)Table;
-(id)tableView:(NSTableView *)Table objectValueForTableColumn:(NSTableColumn *)Column row:(int)Row;

@end

@implementation controller

-(void)awakeFromNib
{
    tbvItem_One = [[clsTableView alloc] init];
    tbvItem_Two = [[clsTableView alloc] init];
    tbvItem_One.strtbviewItem = @"Eintrag 1";
    tbvItem_Two.strtbviewItem = @"Eintrag 2";
    
    maItems = [[NSMutableArray alloc] init];
    [maItems addObject:tbvItem_One];
    [maItems addObject:tbvItem_Two];
}

-(int)numberOfRowsInTableView:(NSTableView *)Table
{
    return [maItems count];
}

-(id)tableView:(NSTableView *)Table objectValueForTableColumn:(NSTableColumn *)Column row:(int)Row
{
    return [maItems objectAtIndex:Row];
}

@end

Vielleicht kann mir jemand auf die Sprünge helfen. Danke schommal im vorraus.

mfg
paule