用NSArrayController結合Cocoa綁定實作TableView中資料自動排序
Cocoa的綁定機制是一個強大的工具,尤其對table填充和排序資料時特别有用。通過代碼實作對table資料填充及排序時需要相當數量的代碼量,而通過Cocoa綁定可以減少大部分的代碼,不能說零代碼,但是至少省事很多。這篇技術文檔介紹如何通過Cocoa綁定實作對NSArrayController提供資料的tableview的行資料實作自動排序。
引言
在我們的例子中,首先建立了一個具有兩列NSTableColumn的NATableView,這兩列的資料綁定到名為“MyArray”的NSArrayController中。将NSArrayController的類設定為NSMutableDictionary,有兩個鍵分别為lastname, firstname。每列NSTableColumn按照如下格式綁定:
列 | 綁定到 | Controller Key | Model Key Path |
---|---|---|---|
Last Name | “MyArray” | arrangedObjects | lastname |
First Name | “MyArray” | arrangedObjects | firstname |

當table第一次加載和顯示時你可以告訴table view如何對資料進行排序,用如下代碼可以實作table 初始化時以Last name排序。這段代碼應當位于控制器對象中,該控制器中也要存在一個對tableview引用的Outlet對象,通常位于
awakeFromNib
方法中
[myTableView setSortDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"lastname" ascending:YES] autorelease]]];
此時使用者可以通過在每列NSTableColumn标題處點選進行排序。
自動對tableview資料排序(Mac OS X 10.5之前)
當使用者添加很多names到table中時,清單會出現未排序的情況,在向表中添加其他name時,應該如何保持正确的排序順序?這就是綁定到NSArrayController的NSSortDescriptor對象派上用場的地方。
您需要将NSArrayController綁定到一組NSSortDescriptor對象上,這可以通過提供一個控制器對象執行一個方法來傳回NSSortDescriptor對象的NSArray來實作。
傳回NSSortDescriptors的控制器對象
@implementation MyControllerObject
- (NSArray *)sortDescriptors
{
return [myTableView sortDescriptors];
}
//...
@end
然後,可以綁定NSArrayController到“MyControllerObject”,Model Key Path = sortDescriptors.
即使已經綁定了該關系,插入新資料仍然不會自動排序。在列頭标題箭頭顯示已經排序的情況下會導緻我們陷入困惑,為什麼會這樣呢?我們已經把排序完全交給了數組控制器,有一個好辦法就是告訴控制器通知并調用rearrangeObjects。
下面示例如何給NSArrayController添加一個新的name
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
@"Sally", @"firstname",
@"Sixpack", @"lastname",
nil];
[myArrayController addObject: dict];
[myArrayController rearrangeObjects];
Mac OS X 10.5的改進
感謝在10.5版本中對NSArrayController加入了”Auto Rearrange Objects”屬性,Mac OS X 10.5以後不再需要調用以下方法來自動排序資料:
可以通過以下任一方法使用”Auto Rearrange Objects”特性實作tableview資料排序:
- 在NSArrayController的xib屬性中設定”Auto Rearrange Objects”勾選框為選中狀态。
- 代碼中調用[myArrayController setAutomaticallyRearrangesObjects:YES];
此時,給array controller 中添加name時将會進行自動排序。