how to add json and stepper value store in using b

2019-02-24 18:22发布

问题:

i am new in ios developer.i want to store json and stepper value.i have already store json and stepper value is nsmutablearray but problem is when i back to the screen that time this array new value is overwrite to old value.but i want to store old nad new value both.i upload my json response.

  {
Data: [
{
m_id: "1",
m_name: "Shirts(Man)",
m_drycleaning_price: "12",
m_washiron_price: "25",
m_wash_price: "10",
m_iron_price: "9",
m_imagename: "a"
},
{
m_id: "2",
m_name: "Pants(Man)",
m_drycleaning_price: "15",
m_washiron_price: "12",
m_wash_price: "13",
m_iron_price: "10",
m_imagename: "s"
},

here is my screen shot

here is my code AppDelegate.h

#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic)NSMutableArray *filteredArray;

AppDelegate.m

#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate
@synthesize filteredArray,abc;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    filteredArray = [[NSMutableArray alloc]initWithArray:[[NSUserDefaults standardUserDefaults]objectForKey:@"def_orderarraylist"]];
    NSLog(@"testdd=%@",filteredArray);


    // Override point for customization after application launch.
    return YES;
}

here this method is add json data in arraycount nsmutablearray

   -(void)fetchdata
    {
        NSString *login= [[NSString stringWithFormat:@"http://o.php"]stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

        NSLog(@"----%@", login);
        NSURL *url = [NSURL URLWithString:[login stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
        //-- Get request and response though URL
        NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url];


        [NSURLConnection sendAsynchronousRequest:request
                                           queue:[NSOperationQueue mainQueue]
                               completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                                   dispatch_async(dispatch_get_main_queue(), ^{
                                       if (data) {
                                           dic_property= [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];


                                           NSMutableArray *tempArray = dic_property[@"Data"];
                                           for (int i=0; i<tempArray.count; i++) {
                                               NSMutableDictionary *dictValues = [NSMutableDictionary dictionaryWithDictionary:tempArray[i]];
                                               [dictValues setValue:@"0" forKey:@"counts"];

                                               [self.arrayCounts addObject:dictValues];

                                           }
                                           [self.tableview reloadData];
                                            NSLog(@"array data=%@",self.arrayCounts);
                                       }
                                       else {
                                           NSLog(@"network error, %@", [error localizedFailureReason]);
                                       }
                                   });

                               }];


    }

here this code i will display json data in tableview and add stepper value in Arraycounts array.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *simpleTableIdentifier = @"SimpleTableItem";

    custom *cell = (custom *)[self.tableview dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (cell == nil)
        cell = [[[NSBundle mainBundle] loadNibNamed:@"customcell" owner:self options:nil] objectAtIndex:0];
   // cell.lblcount.text = self.arrayCounts[indexPath.row][@"counts"];
    cell.lbltitle.text=self.arrayCounts[indexPath.row][@"m_name"];;

    [cell.stepper addTarget:self action:@selector(itemsChange:) forControlEvents:UIControlEventValueChanged];
    return cell;
}
- (void)itemsChange:(UIStepper*)stepper
{
    CGPoint cursorPosition = [stepper convertPoint:CGPointZero toView:self.tableview];
    NSIndexPath *indexPath = [self.tableview indexPathForRowAtPoint:cursorPosition];

    custom *currentCell = (custom *)[self.tableview cellForRowAtIndexPath:indexPath];

    double value = [stepper value];

    [currentCell.lblcount setText:[NSString stringWithFormat:@"%d", (int)value]];

    self.arrayCounts[indexPath.row][@"counts"] = [NSString stringWithFormat:@"%d",(int)value];


}

here this code is i will add selected stepper value in filteredArray array.i get perfect value in filteredArray but old value is overwrite.i use NSUserDefaults but not solve problem.

    - (IBAction)placeorder:(id)sender {
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"counts != %@",@"0"];
    AppDelegate *myAppDelegate = [[UIApplication sharedApplication] delegate];
        myAppDelegate.filteredArray =(NSMutableArray *) [self.arrayCounts filteredArrayUsingPredicate:predicate];
    NSLog(@"value:%@",myAppDelegate.filteredArray);
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
     [userDefaults setObject:myAppDelegate.filteredArray forKey:@"def_orderarraylist"];
    second *next=[self.storyboard instantiateViewControllerWithIdentifier:@"secondpage"];
    [self presentViewController:next animated:YES completion:nil];
}

second page code

second.h

    #import <UIKit/UIKit.h>

@interface second : UIViewController

@property (weak, nonatomic) IBOutlet UIBarButtonItem *back;
- (IBAction)back:(id)sender;

second.m

- (void)viewDidLoad {
    [super viewDidLoad];


    NSMutableArray *test = [[NSMutableArray alloc]initWithArray:[[NSUserDefaults standardUserDefaults]objectForKey:@"def_orderarraylist"]];
    NSLog(@"testdd=%@",test);
    NSLog(@"old value=%@",[SharedUser getInstance].arrayCounts);


    // Do any additional setup after loading the view.
}

- (IBAction)back:(id)sender {
    ViewController *next=[self.storyboard instantiateViewControllerWithIdentifier:@"firstpage"];
    [self presentViewController:next animated:YES completion:nil];
}

pls.. help me.

回答1:

You need to update only - (IBAction)back:(id)sender in Second.m Currently you are presenting the SecondViewController from Viewcontroller.m. When you go to back from Second.m to First you are Pushing the first viewcontroller. you are alloc the new. it will create new reference insted of old, so your old value will not get. Replace your - (IBAction)back:(id)sender method with below code.

- (IBAction)back:(id)sender {
    [self dismissViewControllerAnimated:NO completion:nil];
}

OR

- (IBAction)back:(id)sender {
    [self.navigationController popViewControllerAnimated:YES];
}

Suggestion: for storing and transfer array to another Viewcontroller you not need to use AppDelegae, NSUserDefault or Singletone class. Directily you have to pass array from one VC to Another VC. i.e Below Code.... SecondVC.h

#import <UIKit/UIKit.h>

@interface second : UIViewController
@property (strong,nonatomic)NSMutableArray *arrSelectedArray;
@end

FirstVC.m here you can get secondVC's array using secondVC'sObj.arrayname and addvalue from first CV to anotherVC

- (IBAction)placeorder:(id)sender {
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"counts != %@",@"0"];
    NSArray *tmpArray = [self.arrMain filteredArrayUsingPredicate:predicate];
    second *next=[self.storyboard instantiateViewControllerWithIdentifier:@"secondpage"];

    next.arrSelectedArray = [NSMutableArray arrayWithArray:tmpArray];

    [self presentViewController:next animated:YES completion:nil];
}