2011-03-13 42 views
3

多個部分詢問有關訂貨這個問題的目的範圍內訂貨數據。以下MyObject類將使用隨機生成的類別名稱返回一個實例。Objective-C的iPhone - 的一個UITableView數據源

我用下面的方法dataSource

numberOfSections[dataSource count]訪問。

titleForSection[[dataSource objectAtIndex:indexPath.section] valueForKey:@"categoryName"]訪問。

numberOfRowsInSection[[[dataSource objectAtIndex:indexPath.section] valueForKey:@"myObjects"] count]訪問。

最後,每一行的MyObject[[[dataSource objectAtIndex:indexPath.section] valueForKey:@"myObjects"] objectAtIndex:indexPath.row]cellForRowAtIndexPath方法來訪問。

我使用下面的代碼來創建一個顯示9個節類別的dataSource,但是我有點卡住了這些類別和其中的數據的排序。假設有NSDate屬性作爲MyObject類的一部分。

問題:我該如何去使用它以降序顯示記錄?

- (void)createDatasource 
{ 
    NSInteger numberOfObjects = 10; 
    NSMutableArray *objects = [NSMutableArray arrayWithCapacity:numberOfObjects]; 
    NSMutableArray *categories = [NSMutableArray arrayWithCapacity:numberOfObjects]; 
    for (int i = 0; i < numberOfObjects; i++) 
    { 
     MyObject *obj = [[MyObject alloc] init]; 
     [objects addObject:obj]; 
     [categories addObject:obj.category]; 
     [obj release]; 
    } 
    NSSet *set = [NSSet setWithArray:categories]; 
    NSMutableArray *dataSource = [[NSMutableArray alloc] initWithCapacity:[set count]]; 
    for (NSString *categoryString in set) 
    { 
     NSMutableDictionary *mainItem = [[NSMutableDictionary alloc] initWithObjectsAndKeys:nil, @"categoryName", nil, @"myObjects", nil]; 
     NSMutableArray *mainItemMyObjects = [NSMutableArray array]; 
     [mainItem setValue:categoryString forKey:@"categoryName"]; 
     for (MyObject *obj in objects) 
     { 
      if ([obj.category isEqualToString:categoryString]) 
      { 
       [mainItemMyObjects addObject:obj]; 
      } 
     } 
     [mainItem setValue:mainItemMyObjects forKey:@"myObjects"]; 
     [dataSource addObject:mainItem]; 
     [mainItem release]; 
    } 
    NSLog (@"objects = %@\ncategories = %@\nset = %@\ndatasource = %@", objects, categories, set, dataSource); 
} 

回答

2

最簡單的方法是使用NSMutableArray's sorting mutatorsNSArray's sorting methods對數組進行排序。否則,您必須構建從輸入索引到dataSource索引的映射,供各種數據源方法使用。


編輯排序要求的示例代碼,這樣的事情應該工作。我假設您想要通過MyObject上名爲date的屬性對所有內容進行排序。

// First, sort the myObject mutable array in each category 
for (NSDictionary *d in dataSource) { 
    [[d valueForKey:@"myObjects"] sortUsingComparator:^NSComparisonResult(id o1, id o2){ 
     // Compare dates. NSDate's 'compare:' would do ascending order, so if we just 
     // reverse the order of comparison they'll come out descending. 
     return [[o2 date] compare:[o1 date]]; 
    }]; 
} 

// Second, sort the categories by the earliest dated object they contain 
[dataSource sortUsingComparator:^NSComparisonResult(id o1, id o2){ 
    // Extract the first object from each category's array, which must be the 
    // earliest it contains due to the previous sort. 
    MyObject *myObject1 = [[o1 valueForKey:@"myObjects"] objectAtIndex:0]; 
    MyObject *myObject2 = [[o2 valueForKey:@"myObjects"] objectAtIndex:0]; 

    // Compare dates, as above. 
    return [[myObject2 date] compare:[myObject1 date]]; 
}]; 
+0

我很好排序我的陣列。這是與這些數組一起排序的問題。 – fuzz 2011-03-15 02:45:51

+1

如果您對每個行數組進行排序,則可以根據每個節的行數組中的第一個對象對節進行排序。或者,如果更適合您的數據集,則可以按照完全不同的方式對各個部分進行排序。 – Anomie 2011-03-15 02:53:30

+0

@Anomie你介意提供一些代碼來做到這一點嗎? – fuzz 2011-03-16 12:43:57

相關問題