• Wieder einmal haben uns unsere Apfeltalker tolle Fotos zur Abstimmung eingesandt. Welches ist Euer Favorit? Stimmt mit ab! Hier geht es zur Abstimmung --> Klick
  • Es ist bereits Apfeltalk-Tradition und wir möchten sie auch in diesem Jahr fortsetzen: Unser Apfeltalk-Weihnachtslogo-Wettbewerb hat begonnen! Gestaltet für uns das Weihnachtsbanner, das im Monat Dezember bis zum Weihnachtsfest unsere Webseite schmücken soll. Lasst Eurer Kreativität freien Lauf! Hier geht es zum Wettbewerb --> Klick

NSTableView mit verschiedenen Arrays füllen

branco145

Rheinischer Winterrambour
Registriert
26.07.09
Beiträge
933
In meinem Fenster habe ich eine NSTableView und darüber ein SegmentControl mit 5 Elementen. Wenn man jeweils auf diese Reiter klickt soll das filteredArray mit dataArray1, 2, 3, 4 oder 5 gefüllt und in der TableView angezeigt werden. Klappt auch.

Code:
NSMutableArray *filteredArray = [[NSMutableArray alloc] initWithArray:dataArray2];
[filteredArray count];
[tableView reloadData];

NUR: Wenn in einem Array mehr drin ist, als in dem anderen wird zusätzlich die Scrollbar (den Platz den das vorherige Array brauchte) angezeigt und die TableView aktualisiert nicht richtig...

Was wäre der richtige Weg, die TableView mit Array1, danach mit Array2 etc zu befüllen?
Danke für euere Hilfe.
 
Wenn die Scrollbar erscheint, dann hat die Tabelle mehr Zeilen, als im TableView sichtbar sein können. Deine drei Zeilen Code da erzeugen übrigens ein Speicherleck.

MacApple
 
Ich mag mich irren, aber Zeile 2 kann nichts sinnvolles machen.

Viele Grüße
 
Das die Tabelle mehr Zeilen darstellt als im Array sind, weiß ich. Weil Array1 z.B 20 Einträge hat und ich dann auf Array2 mit nur 10 Einträgen wechsle. Meine Frage ist wie ich das verhindere, das er die Anzahl der Tabellenzeilen des ersten Arrays beibehält.
 
Lade doch mal ein Beispielprojekt hoch. So ohne Code ist's schwierig zu helfen.

MacApple
 
Hier ein Beispielprojekt, habs schnell aus dem Hauptprojekt rüber angepasst...

Wenn man jetzt bei der zuerst angezeigten TableView nach ganz unten scrollt und dann ganz unten einen Eintrag auswählt und dann oben auf einen anderen Reiter geht, bleibt der Scrollbalken. Wenn man dann nochmal auf einen anderen Reiter geht, bleibt das Array des vorhergehenden Reiters.

Beispielprojekt:
http://cl.ly/3mzQ

Die MyScroller.h und MyScroller.m löschen, sonst wird der Scrollbalken nicht angezeigt.
 
Also, dass Du massiv Speicherlecks produzierst, habe ich ja schon gesagt. Warum machst Du für filteredArray nicht eine Property und benutzt die Accesoren?

Das Scrollerproblem liegt nicht primär am Austausch der Arrays, sondern am Zugriff auf nicht vorhandene Elemente des aktuellen Array. Die Fehlermeldung
Code:
*** -[NSCFArray objectAtIndex:]: index (-1 (or possibly larger)) beyond bounds (6)
sagt Dir das ja auch. Dieser Zugriff auf ein nicht vorhandenes Element des Arrays erfolgt in Deiner Methode _performAnimationFromSelectedRowToImage. Wenn man nämlich eine Zeile ausgewählt hat, die in der neu angezeigten Tabelle nicht vorhanden ist, weil sie halt kürzer ist, wird auch die NSTableViewSelectionDidChangeNotification ausgelöst. Folge davon ist, dass die selectedRow = -1 ist.

MacApple
 
Die Notification kannst Du nicht verhindern. Du musst halt prüfen, ob selectedRow == -1 ist und entsprechend reagieren.

MacApple
 
Habs's mal so gemacht, löst die Probleme so erstmal.

Code:
- (void)_performAnimationFromSelectedRowToImage {
	NSInteger selectedRow = [tableView selectedRow];
	if(selectedRow == -1)
	{
		NSLog(@"Selected row is -1");
	}
	else {
	[tableView scrollRowToVisible:selectedRow];        
	TableEntry *currentEntry = [filteredArray objectAtIndex:selectedRow];
	[textField setString: [currentEntry description]];
	}
}
 
Wenn Du es schön machen willst, dann löschst Du das Textfeld, wenn nichts ausgewählt ist.

MacApple