2010-10-20 6 views
13

Ich bin neu auf dem Mac. Ich versuche, eine bestimmte Zelle in NSTableView zu aktualisieren, ohne -reloadData zu verwenden, da -reloadData die gesamte Tabelle aktualisiert. Ich habe alles versucht, aber alles war umsonst. Ich versuche etwas zu tun, was wir in CListCtrl in MFC oder in .NET getan haben.Wie aktualisiert man NSTableView ohne -reloadData?

+1

Lassen Sie mich ein bisschen mehr, ich don klären Ich möchte nicht, dass der Tisch neu gezeichnet wird. Ich möchte eine Methode, in der ich die row_number, column_number oder NSTableColumn und das (id) Datenobjekt übergeben kann. – Omayr

+10

@Mike Abdullah Ich hätte es geschätzt, wenn Sie stattdessen eine Lösung vorgeschlagen hätten! – Omayr

+3

Wenn Sie einer Gemeinschaft beitreten, ist es normalerweise eine gute Idee, die Konventionen dieser Gemeinschaft zur Kenntnis zu nehmen und zu übernehmen. Im Fall der Mac-Entwickler-Community deutet die Angabe "MAC" auf Unkenntnis der Plattform hin. –

Antwort

27

Werfen Sie einen Blick auf reloadDataForRowIndexes:columnIndexes: Methode. Um eine einzelne Zelle zu aktualisieren Folgendes sollte funktionieren:

[yourTable reloadDataForRowIndexes:[NSIndexSet indexSetWithIndex:row] 
        columnIndexes:[NSIndexSet indexSetWithIndex:column]]; 
+0

Docs Link: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTableView_Class/Reference/Reference.html#//apple_ref/occ/instm/NSTableView/reloadDataForRowIndexes:columnIndexes: –

+0

Während dies die richtige Lösung ist, sollte erwähnt werden, dass reloadData() auch nur die aktuell sichtbaren Zellen und nicht die gesamte Tabelle neu rendert. – Matt

-3

Regel über reloadData: die gesamte Tabelle aktualisieren, ist das richtige Design-Muster. Warum bist du so abgeneigt? Ist es aus Gründen der Effizienz, oder sind Sie auf die Tabelle angewiesen, um einige Zustände zu speichern und das Neuladen aller Daten stört das? Letzteres ist normalerweise ein Zeichen dafür, dass Sie Ihre Architektur überdenken müssen.

+2

Ich möchte dies wegen der Effizienz tun.Wie ich 8-10 Zellen pro Sekunde aktualisieren muss, möchte ich in diesem Fall nicht die ganze Tabelle immer wieder aktualisiert werden! – Omayr

18

Dies ist ein grundlegender Unterschied zwischen der Art und Weise, wie Ansichten in Cocoa normalerweise funktionieren und wie sie in anderen Frameworks funktionieren. NSTableView stellt eine -reloadDataForRowIndexes:columnIndexes:-API bereit, wie Vladimir hervorhebt, aber Sie werden das Fehlen eines Parameters "withObject:" bemerken.

Dies ist, weil Cocoa Ansichten und Steuerelemente sind nicht entworfen, um auch als Datencontainer zu fungieren. Sie dienen vielmehr zur Darstellung und Interaktion mit Daten, die von einem anderen Modellobjekt verwaltet werden, normalerweise über einen Zwischencontroller.

Bei einer Tabellenansicht, zum Beispiel, wenn Ihr Modell Ihren Controller darüber informiert hat, dass bestimmte Daten geändert wurden, kann der Controller den angezeigten Teil der Tabelle ungültig machen - falls dort angezeigt wird Teil der Tabelle. Beim nächsten Zeichnen fragt die Tabelle ihre Datenquelle (den Controller) nach den Werten, die für den Bereich angezeigt werden sollen, den sie neu zeichnen muss.

Trotz einer oberflächlichen Ähnlichkeit in der Benutzerinteraktion werden Sie wahrscheinlich überdenken wollen, wie Sie den Code schreiben, um Ihre Benutzerschnittstelle zu implementieren. Sie werden am Ende mit viel mehr faktorisierten Model-View-Controller-Stil-Code enden; Der Preis besteht darin, dass Sie Ihr Modell genauer darstellen müssen, als Sie es in Rahmenwerken hätten tun können, die keine solche Trennung von Bedenken erfordern.

1

Ein vollständiges Beispiel für reloadDataForRowIndexes mit allen Zeilen zu aktualisieren, sondern nur eine einzige Spalte:

int col = 2 ; 
[self.myTable reloadDataForRowIndexes: 
    [NSIndexSet indexSetWithIndexesInRange: 
     NSMakeRange(0,self.myTable.numberOfRows)] 
    columnIndexes: 
     [NSIndexSet indexSetWithIndex:col] 
]; 

oder alle Spalten für eine einzelne Zeile:

int row = 2 ; 
[self.myTable reloadDataForRowIndexes: 
    [NSIndexSet indexSetWithIndex:row] 
columnIndexes: 
    [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.myTable.numberOfColumns)] 
]; 
+0

In Ihrem zweiten Beispiel kann 'reloadDataForRowIndexes: columnIndexes:' keinen NSRange verwenden, also müssen Sie Folgendes tun: '[NSIndexSet indexSetWithIndexesInRange: NSMakeRange (0, _tableView.numberOfColumns)]' – TheNextman