排序我的nsmutabledictionary

时间:2012-06-15 13:07:18

标签: iphone objective-c xcode sorting nsdictionary

对此词典进行排序的代码是什么:

{
        "a) Saudi Arabia" =     (
            "2012/06/04 Huge Sandstorm",
            "2011/03/30 Huge Sandstorm"
        );
        "b) Niger" =     (
            "2012/05/27 Huge Sandstorm"
        );
        "c) ****** QUATRE" =     (
            "2011/03/30 7Huge Sandstorm over niger",
            "2011/03/30 8Huge Sandstorm over niger",
        );
    }

我的UItableView?

使用此代码我的标题标题部分是有序的,但不是内容:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    NSArray *allKeys = [[states allKeys] sortedArrayUsingSelector:@selector(compare:)];
    return [allKeys objectAtIndex:section];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";       
    UITableViewCell *cell = (UITableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];           
    }

    NSArray *allKeys = [states allKeys] ;
    NSString *curKey = [allKeys objectAtIndex:indexPath.section];
    NSArray *curArray = [states objectForKey:curKey];
    curValue = [curArray objectAtIndex:indexPath.row];

    cell.textLabel.text = curValue; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;   
    [[cell textLabel] setFont:[UIFont systemFontOfSize:12.0]];
    return cell;  
}

有人可以帮助我吗?

6 个答案:

答案 0 :(得分:1)

//使用此代码

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
 {
     return [[states allKeys] count];//returns the number of key/object pairs
 }

 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
 {
      NSArray *allKeys = [[states allKeys] sortedArrayUsingSelector:@selector(compare:)];
      return [allKeys objectAtIndex:section];
  }

  - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
       NSArray *allKeys = [[states allKeys] sortedArrayUsingSelector:@selector(compare:)];
       NSString *curKey = [allKeys objectAtIndex:section];
       NSArray *curArray = [states objectForKey:curKey];

       return [curArray count];
     }

     - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
          static NSString *CellIdentifier = @"Cell";

           UITableViewCell *cell = (UITableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

     if (cell == nil) {
         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

     }
     // Configure the cell...

     //---------- CELL BACKGROUND IMAGE -----------------------------
     UIImageView *imageView = [[UIImageView alloc] initWithFrame:cell.frame];
     UIImage *image = [UIImage imageNamed:@"LightGrey.png"];
     imageView.image = image;
     cell.backgroundView = imageView;
     [[cell textLabel] setBackgroundColor:[UIColor clearColor]];
      [[cell detailTextLabel] setBackgroundColor:[UIColor clearColor]];


     NSArray *allKeys = [[states allKeys] sortedArrayUsingSelector:@selector(compare:)];

     NSString *curKey = [allKeys objectAtIndex:indexPath.section];
    NSArray *curArray = [[states objectForKey:curKey]     sortedArrayUsingSelector:@selector(compare:)];
     NSString *curValue=@"";
     if([curArray count]>indexPath.row) 
         curValue = [curArray objectAtIndex:indexPath.row];

   if(curValue)
       cell.textLabel.text = curValue;

     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

     [[cell textLabel] setFont:[UIFont systemFontOfSize:12.0]];
     return cell;

 }

  - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

     return 60;

   }

可能会帮助你

答案 1 :(得分:0)

您要在titleForHeaderInSection中对字典进行排序,而不是在cellForRowAtIndexPath中。

也许你可以在创建整个字典时对其进行排序,以便在UITableView刷新时不必重新排序。这样,您只需要对其进行一次排序,然后键和值将始终按照正确的顺序填充节标题和单元格。

答案 2 :(得分:0)

这里可能有用。如果您有疑问,请告诉我。在调用tableview之前编写此代码。

 NSSortDescriptor *sortDesc = [[NSSortDescriptor alloc] initWithKey:@"birthDate" ascending:YES selector:@selector(compare:)]; //pass the key of your dictionary here
[allKeys sortUsingDescriptors:[NSArray arrayWithObject:sortDesc]];

答案 3 :(得分:0)

您需要对curKey

进行排序
NSArray *curArray = [states objectForKey:curKey];
//Add this line after currArray
NSArray *sorterCurArray = [curArray sortedArrayUsingSelector:@selector(compare:)];
//Use sorterCurArray instead
curValue = [sorterCurArray objectAtIndex:indexPath.row];

答案 4 :(得分:0)

 write the same code in your cellForRowAtIndexPath: too for accessing key

NSArray *allKeys = [[states allKeys] sortedArrayUsingSelector:@selector(compare:)];

答案 5 :(得分:0)

//
//  ViewController.m
//  StoryboardTutorial
//
//  Created by Kurry Tran on 10/20/11.
//  Copyright (c) 2011 __MyCompanyName__. All rights reserved.
//

#import "ViewController.h"
#import "DetailViewController.h"
@implementation ViewController
@synthesize states,datasource,curValue,sortedArray,descriptor;
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [self setupArray];
    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.
}

-(void)setupArray{

    NSURL *myUrl=[NSURL URLWithString:@"the link with the dictionary"];
  //  NSString *str = [NSString stringWithContentsOfURL:myUrl usedEncoding:nil error:nil]; //load above string here
    NSMutableDictionary *dict=[NSMutableDictionary dictionaryWithContentsOfURL:myUrl];

//    NSString *str =@"# 2012/20110930 Huge Sandstorm over niger# just for the test/20110330 AHuge Sandstorm over niger/20110330 BHuge Sandstorm over niger";

//    NSArray * firstArry = [str componentsSeparatedByString:@"#"];
//    NSMutableArray *secondArry = [[NSMutableArray alloc] init]; //Will hold the # titles
//    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; //Will hold the strings related to # title
//    for(NSString *firstArryStr in firstArry)
//    {
//        NSArray *tempArry = [firstArryStr componentsSeparatedByString:@"\n"];
//        NSMutableArray *titleStingsArry = [[NSMutableArray alloc] init];
//        for (int i=0; i< [tempArry count];i++) {
//            if (i==0) {
//                NSString *title = [tempArry  objectAtIndex:i];
//                [secondArry addObject:title];
//                [dict setValue:titleStingsArry  forKey:title];
//            } else {
//                [titleStingsArry  addObject:[tempArry  objectAtIndex:i]];
//            }
//        } 
    NSLog(@"%@",dict);

//    }    

//    NSString *myString = @"20110330 AHuge Sandstorm over niger/20110330 BHuge Sandstorm over niger/20110330 CHuge Sandstorm over niger/20110330 1Huge Sandstorm over niger/20110330 2Huge Sandstorm over niger/20110330 3Huge Sandstorm over niger/20110330 4Huge Sandstorm over niger/20110330 5CHuge Sandstorm over niger/20110330 6Huge Sandstorm over niger";
//    NSArray *event = [myString componentsSeparatedByString:@"/"];
//    states = [NSMutableArray arrayWithArray:event];

    self.states = [NSMutableDictionary dictionaryWithDictionary: dict];
datasource = [dict allKeys];

    self.navigationItem.title = @"test";



}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [states count];//returns the number of key/object pairs
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    NSArray *allKeys = [[states allKeys] sortedArrayUsingSelector:@selector(compare:)];

    return [allKeys objectAtIndex:section];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSArray *allKeys = [states allKeys];
    NSString *curKey = [allKeys objectAtIndex:section];
    NSArray *curArray = [states objectForKey:curKey];

    return [curArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = (UITableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

    }
    // Configure the cell...

    //---------- CELL BACKGROUND IMAGE -----------------------------
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:cell.frame];
    UIImage *image = [UIImage imageNamed:@"LightGrey.png"];
    imageView.image = image;
    cell.backgroundView = imageView;
    [[cell textLabel] setBackgroundColor:[UIColor clearColor]];
    [[cell detailTextLabel] setBackgroundColor:[UIColor clearColor]];


    NSArray *allKeys = [[states allKeys] sortedArrayUsingSelector:@selector(compare:)];

    NSString *curKey = [allKeys objectAtIndex:indexPath.section];
    NSArray *curArray = [states objectForKey:curKey];

    if([curArray count]>indexPath.row) curValue = [curArray objectAtIndex:indexPath.row];


    cell.textLabel.text = curValue;

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    [[cell textLabel] setFont:[UIFont systemFontOfSize:12.0]];
    return cell;

}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    NSArray *allKeys = [states allKeys];
    NSString *curKey = [allKeys objectAtIndex:indexPath.section];
    NSArray *curArray = [states objectForKey:curKey];
    curValue = [curArray objectAtIndex:indexPath.row];

    DetailViewController *detail = [self.storyboard instantiateViewControllerWithIdentifier:@"detail"];
    // detail.state = [states objectAtIndex:indexPath.row];
    detail.state = curValue;
    [self.navigationController pushViewController:detail animated:YES];

}

//- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
//{
//    //normal cell acquisition code
//    
//    NSArray *allKeys = [states allKeys];
//    NSString *curKey = [allKeys objectAtIndex:indexPath.section];
//    NSArray *curArray = [states objectForKey:curKey];
//    NSString *curValue = [curArray objectAtIndex:indexPath.row];
//    //Do something with the string
//
//}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    return 60;

}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end