iOS Using NSDictionary to load data into section a

2019-02-16 01:10发布

I wish to display table section with date as the section title and name of book in the row. I'm all lost at how to use a NSDictionary to load data into section and rows. Therefore my codes are all screwed up :( Can anyone offer some help, with some sample codes as a guide? My NSMutableArray is as followed:

(
        {
        BIBNo = 187882;
        date = "14/08/2012";
        itemSequence = 000010;
        name = "Increasing confidence / Philippa Davies.";
        noOfRenewal = 0;
        number = 000187907;
        status = "Normal Loan";
        time = "24:00";
        type = Loans;
    },
        {
        BIBNo = 291054;
        date = "14/08/2012";
        itemSequence = 000010;
        name = "iPhone application development for IOS 4 / Duncan Campbell.";
        noOfRenewal = 2;
        number = 000291054;
        status = "Normal Loan";
        time = "24:00";
        type = Loans;
    },
        {
        BIBNo = 244441;
        date = "15/08/2012";
        itemSequence = 000010;
        name = "Coach : lessons on the game of life / Michael Lewis.";
        noOfRenewal = 1;
        number = 000244441;
        status = "Normal Loan";
        time = "24:00";
        type = Loans;
    },
        {
        BIBNo = 290408;
        date = "15/08/2012";
        itemSequence = 000010;
        name = "Sams teach yourself iPhone application development in 24 hours / John Ray.";
        noOfRenewal = 3;
        number = 000290408;
        status = "Normal Loan";
        time = "24:00";
        type = Loans;
    },
        {
        BIBNo = 161816;
        date = "16/08/2012";
        itemSequence = 000010;
        name = "Malaysian Q & As / compiled by Survey & Interview Department ; illustrations by Exodus.";
        noOfRenewal = 1;
        number = 000161817;
        status = "Normal Loan";
        time = "24:00";
        type = Loans;
    },
        {
        BIBNo = 187883;
        date = "16/08/2012";
        itemSequence = 000010;
        name = "Positive thinking / Susan Quilliam.";
        noOfRenewal = 3;
        number = 000187899;
        status = "Normal Loan";
        time = "24:00";
        type = Loans;
    }
)

How do i actually re-add the objects into NSDictionary so that objects with the same date would be stored together to be displayed as rows in the section? Please offer me some advice thanks! T_T

4条回答
放荡不羁爱自由
2楼-- · 2019-02-16 01:20

In short, you can't re-add objects to an NSDictionary. That is because NSDictionary is immutable. Once it has been created, it's contents can not be modified. What you want is an NSMutableDictionary.

You can then use the setObject: forKey: method.

[MyDict setObject:@"Normal Loan" forKey:@"status"];

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsmutabledictionary_Class/Reference/Reference.html

查看更多
时光不老,我们不散
3楼-- · 2019-02-16 01:29
 - Dictionary of sections by date
  |
   --- array of row objects for the date1
  |    |
  |     --- row dictionary with the data to display
  |    |
  |     --- row dictionary with the data to display
  |    |
  |     --- row dictionary with the data to display
  |    |
  |     --- row dictionary with the data to display
  |
  |
  |
   --- array of row objects for the date2
  |    |
  |     --- row dictionary with the data to display
  |    |
  |     --- row dictionary with the data to display
  |    |
  |     --- row dictionary with the data to display
  |
  |
  |
  |
   --- array of row objects for the date3
       |
        --- row dictionary with the data to display
       |
        --- row dictionary with the data to display
       |
        --- row dictionary with the data to display
       |
        --- row dictionary with the data to display
       |
        --- row dictionary with the data to display
查看更多
叼着烟拽天下
4楼-- · 2019-02-16 01:33

To process your data you would need to do something like

NSMutableDictionary *dataSource = [[NSMutableDictionary alloc] init]; // This would need to be an ivar

for (NSDictionary *rawItem in rawItems) {
    NSString *date = [rawItem objectForKey:@"date"]; // Store in the dictionary using the data as the key

    NSMutableArray *section = [dataSource objectForKey:date]; // Grab the section that corresponds to the date

    if (!section) { // If there is no section then create one and add it to the dataSource
        section = [[NSMutableArray alloc] init];
        [dataSource setObject:section forKey:date];
    }

    [section addObject:rawItem]; // add your object
}

self.dataSource = dataSource;

Then to get the section title

NSArray *sections =[[self.dataSource allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
return [sections objectAtIndexPath:indexPath.section];

Then to get a row in a section

NSString *sectionTitle = // get the section title calling the above code
NSArray *items = [self.dataSource objectForKey:sectionTitle];

return [items objectAtIndex:indexPath.row];
查看更多
5楼-- · 2019-02-16 01:35

As A-Live said you are going to have to sort your Array in to a Mutable Dictionary of Arrays

The following code should work, but it's untested

In TableView Controller .h

@interface MyController:UITableViewController{
   NSMutableArray* dict;
   NSMutableArray* array;
}

In MyController.m

-(void)initWithBooksArray:(NSArray*)bookArray{ //Or something similar

    self = [[super alloc] initWithStyle:UITableViewStylePlain];
    if(self){        
       dict = [[NSMutableDictionary alloc] init];
       array= [[NSMutableArray alloc] init];

       NSMutableArray* sectionArray;
       for(NSDictionary* bookDict in bookArray){

          date = [bookDict valueForKey:@"date"];
          sectionArray = [dict valueForKey:date];
          if(sectionArray){
             [sectionArray addObject:bookDict];
          }else{
             sectionArray = [[NSMutableArray arrayWithObject:bookDict];
             [dict addObject:sectionArray forKey:date];
          }
       }
       array = [[dict allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

    }
    return self;
}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
   return [dict count];
}

-(NSInterger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section{
   NSString* key = [array objectAtIndex:section];
   return [[dict objectForKey:key]count];
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
   return [array objectAtIndex:section];
}

...

// I'll leave it to apple's documentation (or someone else) to fill in the blanks on how to create cells

}

查看更多
登录 后发表回答