天天看點

用NSArrayController結合Cocoa綁定實作TableView中資料自動排序用NSArrayController結合Cocoa綁定實作TableView中資料自動排序

用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

![FAC01530-1112-49FA-B56C-587647D601AA](/Users/mac123/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/819954692/QQ/Temp.db/FAC01530-1112-49FA-B56C-587647D601AA.png)

當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時将會進行自動排序。

繼續閱讀