• 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 - 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.
 

sumpfmonsterjunior

Morgenduft
Registriert
17.03.05
Beiträge
167
Womöglich passt ein NSOutlineView für Deine Daten besser (hierarchisches Modell?)?

Gruß, SMJ
 
Zuletzt bearbeitet:

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
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
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
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).
 

Applecar

Idared
Registriert
24.01.09
Beiträge
24
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..
 

Applecar

Idared
Registriert
24.01.09
Beiträge
24
Aja, es muss

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

heissen... ein schritt weiter ;)
 

Applecar

Idared
Registriert
24.01.09
Beiträge
24
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 :)
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
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.