• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

NSTableView - Doppelte Einträge nicht anzeigen.

Applecar

Idared
Registriert
24.01.09
Beiträge
24
Hallo.
Ich versuche folgendes Verhalten in einer NSTableView zu erreichen:

Das sind meine Daten:
Code:
Spalte 1: Spalte2:
A         Foo
A         Bar
A         NSFooBar
B         BarFoo
B         Text
So soll die Ausgabe aussehen:
Code:
Spalte 1: Spalte2:
A         Foo
          Bar
          NSFooBar
B         BarFoo
          Text
Wie bringe ich Spalte 1 der NSTableView dazu, ein Feld leer zu lassen, wenn es den selben Inhalt hat wie in der Zeile vorher?

Danke für Tips, Applecar.
 
Womöglich passt ein NSOutlineView für Deine Daten besser (hierarchisches Modell?)?

Gruß, SMJ
 
Zuletzt bearbeitet:
Wie bringe ich Spalte 1 der NSTableView dazu, ein Feld leer zu lassen, wenn es den selben Inhalt hat wie in der Zeile vorher?
Wie „fütterst” Du denn Dein NSTableView? Per DataSource oder per Bindings. Wenn Du es per DataSource machst, hast Du es ja selbst in der Hand, was Du zurückgibst.

Aber wie SMJ bereits anmerkte stellt sich die Frage, ob NSTableView die passende Darstellung Deiner Daten ist.

MacApple
 
Zunächst einmal magst du über SMJs Anmerkung nachdenken. Wenn es kein Modellierungsfehler ist, dann kannst du das mit der Data-Source machen.
Code:
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row
{
   if( tableColumn == aggregatingTableColumn ) {
      if( (row > 0) && ([[[myData objectAtIndex:row-1] prop] isEqualToString:[[myData objectAtIndex:row] prop]]) ) {
         return @"";
      } else {
        return [[myData objectAtIndex:row] prop];
   }
   …
}
Oder so ähnlich (typed in Safari).
 
Hallo,
danke für die Antworten. Mir ist bewusst, dass es NSOutlineView gibt. Die Idee die ich skizziert habe ist vermutlich auch wirklich nicht gut.

Dennoch würde ich es gerne hinbekommen (ich bin sowohl im Programmieren wie in Cocoa ein totaler Neuling). Ich habe versucht den Vorschlag von Amin umzusetzen. Ich habe versucht ein Beispielprogramm aus einem Lehrbuch zu modifizieren. Die Spalten werden darin mit idientifiern angesprochen, die im InterfaceBuilder eingetragen werden. Aber es gelingt mir nicht, die if-Abfrage aus Amin's Vorschlag auf dieses Beispiel zu übertragen. Der identifier für die Spalte ist "personName". Aber so wie ich sie formuliert habe wird die Abfrage nie genommen.

Code:
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex

{
    //What is the identifier for the column?
    NSString *identifier = [aTableColumn identifier];
    
    //What Person?
    Person *person = [employees objectAtIndex:rowIndex];

    NSLog(identifier);
    if(identifier == @"personName")
Obwohl das Log "personName" ausgibt..
 
Aja, es muss

Code:
if([identifier isEqual:@"personName"])

heissen... ein schritt weiter ;-)
 
Ok. Ich habs hinbekommen.
Danke euch. Ich hab auf jedenfall was dazugelernt, auch wenn meine anfängliche Idee wohl nicht so gut war. Nächster Schritt: eigene Cell für die TableView entwerfen :-)
 
Besser noch -isEqualToString: (NSString), siehe auch Negm-Awad, Objective-C und Cocoa, S. 284 ff.

Ansonsten, und daher mein Verrgleich: Du kannst gleich zu Anfang der Instanz (hast du -awakeFromNib?) dir die Spalte holen und dann wirklich einen Pointer-Vergleich auf die Spalte machen, wie du in meinem Code siehst.