2012-06-19 47 views
7

我在NSTableView中有兩個coloumn作爲名稱和薪水5-10值。我想在點擊這兩列的標題後對這些顏色進行排序。互聯網中存在大量數據,但我無法使用這些數據。請幫我做可可。排序NSTableView

在此先感謝,並感謝任何幫助。

+0

我的表有兩個列,如姓名和薪水,我把價值觀硬編碼沒有綁定,現在我想排序數據,我如何執行這個任務。 – upender

回答

12

每個表列有一個方法setSortDescriptorPrototype 排序描述符告訴陣列如何自行解決的方式(上升,下降,忽略大小寫等) 遍歷每一列要作爲排序並在調用此方法每個這些列,並通過所需要的那種描述符(在我來說,我將使用的列標識符)

for (NSTableColumn *tableColumn in tableView.tableColumns) { 

    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:tableColumn.identifier ascending:YES selector:@selector(compare:)]; 
    [tableColumn setSortDescriptorPrototype:sortDescriptor]; 
} 

寫這篇文章的初始化代碼後,NSTableViewDelegate有一個方法- (void)tableView:(NSTableView *)aTableView sortDescriptorsDidChange:(NSArray *)oldDescriptors通知您,每當排序描述符被更改,在委託中實現此方法並向數據arr發送消息唉,以自行解決

- (void)tableView:(NSTableView *)aTableView sortDescriptorsDidChange:(NSArray *)oldDescriptors 
{ 
    self.data = [self.data sortedArrayUsingDescriptors:sortDescriptors]; 
    [aTableView reloadData]; 
} 

這種方法會每單擊列標題時間解僱,NSTableColumn顯示出的排列順序一個可愛的小三角形。

6

我偶然發現這個問題,同時尋找實現類似的最簡單的方法。雖然原來的問題是舊的,但我希望有人發現我的答案很有用!請注意,我使用的Xcode 5.1.1

好了,所以要做到這一點,你需要:

  1. 選擇要在表中排序的實際列。
  2. 在您的屬性檢查器中,您需要填寫兩個字段:排序鍵和選擇器。
  3. 在排序鍵字段中,您需要輸入標識符的值。您的標識符的值位於您的Identity Inspector中。
  4. 在選擇器字段中,您需要根據列中的對象類型輸入合適的選擇器方法。默認方法是;比較:

基於Table View Programming Guide for Mac。 compare:方法適用於NSString,NSDate和NSNumber對象。如果您的表列僅包含字符串,則可能需要考慮在區分大小寫不重要的情況下使用caseInsensitiveCompare:方法。但是,考慮將這些方法簽名替換爲localizedCompare:或localizedCaseInsensitiveCompare:方法,以便將該用戶的語言要求記入該帳戶。

最後,你需要聲明的tableView:sortDescriptorsDidChange:方法在你的表視圖控制器的格式如下圖所示:

-(void)tableView:(NSTableView *)mtableView sortDescriptorsDidChange:(NSArray *)oldDescriptors 
{ 
    [listArray sortUsingDescriptors: [mtableView sortDescriptors]]; 
    [tableView reloadData]; 
} 
+1

排序關鍵字段應該是數據對象中的一個屬性,而不是該列的標識符。 (儘管它們可能相同) – tagy22

相關問題