NSUserDefaults + NSMutableArray -> Storing 2 arrays and display in tableview

I have just implementet a bookmark/favorites function in my app, favorites from a tableview, with the following code, using NSUserDefaults. The cell has 2 labels, the name of the item and a price - stored in the Arrays - theArray and thePriceArray -> like this:

enter image description here

    NSIndexPath *indexPath = [_ListTableView indexPathForCell:(UITableViewCell *)     [[sender superview] superview]];


    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSMutableArray *OrderList = [[defaults objectForKey:ORDER_KEY] mutableCopy];
    if (!OrderList) OrderList = [NSMutableArray array];
    [OrderList addObject:[theArray objectAtIndex:indexPath.row]];
    [OrderList addObject:[thePriceArray objectAtIndex:indexPath.row]];
    [defaults setObject:OrderList forKey:ORDER_KEY];
    [defaults synchronize];

I am now adding the two arrays theArray & thePriceArray, to the NSMutableArray.I now want to show these information (the information from the arraies) in another tableview. I do this like so:

In My viewDidAppear:

    NSUserDefaults *defaults = kSettings;


    NSMutableArray *theOrderList = [NSMutableArray arrayWithArray:[defaults objectForKey:ORDER_KEY]];

And to show the contents in the tableview:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [theOrderList count];
}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

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

    cell.textLabel.text = [theOrderList objectAtIndex:indexPath.row];



    return cell;
}

This is almost working as I want, the contents of theArray and thePriceArray is shown, but in a long list like so:

enter image description here

I want the "key and the value" to be in one cell, so the price and the item name in one cell (Hat - 30) and not seperate, how can I do that? I have tried to use a NSDictionary, but without luck and can I use NSDictionary for this?

Upvotes: 2

Views: 414

Answers (3)

Midhun MP
Midhun MP

Reputation: 107121

You can simply do it using the following code:

NSString *label = [NSString stringWithFormat:@"%@    %@",[theOrderList objectAtIndex:(indexPath.row * 2)],[theOrderList objectAtIndex:(indexPath.row * 2)+1]
cell.textLabel.text = label;

And also change your numberOfRowsInSection like:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [theOrderList count]/2;
}

Upvotes: 1

Paresh Navadiya
Paresh Navadiya

Reputation: 38239

Keep both array theArray and thePriceArray seperate and use one as your main array for data source of tableView.

Note : add data from NSUserDefault to respective array.

Now method will be :

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [theArray count];
}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

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

    cell.textLabel.text = [theArray objectAtIndex:indexPath.row];
    cell.detailTextLabel.text = [thePriceArray objectAtIndex:indexPath.row];
    return cell;
}

Upvotes: 1

Bhavin
Bhavin

Reputation: 27225

You can create two new arrays for favItem and favPrize. Just add your favorite Items to favItem Array and add favorite Prizes to favPrize Array. Now use these arrays to set the labels and detailLabels of your Tableview like :

cell.textLabel.text = [favItems objectAtIndex:indexPath.row];
cell.detailTextLabel.text = [favPrize objectAtIndex:indexPath.row];

Upvotes: 1

Related Questions