как добавить хранилище значений json и stepper с помощью события нажатия кнопки nsmutablearray в ios

Я новичок в ios developer. Я хочу сохранить значение json и stepper. Я уже храню json, а значение stepper равно nsmutablearray, но проблема в том, что когда я возвращаюсь к экрану, в это время новое значение массива перезаписывается старым значением. но я хочу чтобы сохранить старое и новое значение обоих. Я загружаю свой ответ json.

  {
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"
},

вот мой снимок экрана

введите здесь описание изображения

вот мой код 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;
}

здесь этот метод добавляет данные json в 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]);
                                       }
                                   });

                               }];


    }

здесь этот код я буду отображать данные json в табличном представлении и добавлять шаговое значение в массив Arraycounts.

- (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];


}

вот этот код: я добавлю выбранное значение шагового двигателя в массив filteredArray. Я получаю идеальное значение в filteredArray, но старое значение перезаписывается. Я использую NSUserDefaults, но не решаю проблему.

    - (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];
}

код второй страницы

секунда.ч

    #import <UIKit/UIKit.h>

@interface second : UIViewController

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

сек.м

- (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];
}

пожалуйста.. помогите мне.


person Jigar    schedule 15.02.2016    source источник
comment
используйте nsuserdefault и сохраните свой массив   -  person Signare    schedule 15.02.2016
comment
я уже использую nsuserdefault.see событие действия по размещению заказа   -  person Jigar    schedule 15.02.2016
comment
Я не думаю, что NSUserDefaults следует использовать для этого. Вместо этого вы должны использовать шаблон singleton.   -  person NSNoob    schedule 15.02.2016
comment
Сохраните свой изменяемый массив в общем (одноэлементном) классе, и вы сможете получить к нему доступ/сохранить его на всех экранах. (Пока вы не закроете приложение, конечно   -  person NSNoob    schedule 15.02.2016
comment
Если вы ищете постоянное хранилище даже после закрытия приложения, вам нужно будет использовать CoreData или SQLite или простую запись данных в документ устройства. Я однако предлагаю первые два варианта   -  person NSNoob    schedule 15.02.2016
comment
@NSNoob Я использую одноэлементный класс, но та же проблема. Дайте мне код, как использовать одноэлементный класс   -  person Jigar    schedule 15.02.2016
comment
Здесь есть множество вопросов по этому поводу. Там Этот вопрос, где я сам объяснял процесс.   -  person NSNoob    schedule 15.02.2016
comment
@NSNoob сначала я попробую одноэлементный класс, но не решу проблему, чем после того, как кто-нибудь скажет мне объявить массив в файле appdelegate   -  person Jigar    schedule 15.02.2016
comment
Файл делегата приложения также является классом Singleton. Просто идите и следуйте инструкциям, которые я дал в связанном вопросе.   -  person NSNoob    schedule 15.02.2016
comment
@NSNoob хорошо, я попробую   -  person Jigar    schedule 15.02.2016
comment
Проблема с @DarjiJigar возникает из-за `- (IBAction)placeorder:(id)sender`, верно?   -  person Vvk    schedule 15.02.2016
comment
@VvkAghera, пожалуйста, посмотрите этот URL-адрес stackoverflow.com/questions/10476787/   -  person Jigar    schedule 15.02.2016
comment
@VvkAghera этот вопрос об URL-адресе - мой тот же вопрос.   -  person Jigar    schedule 15.02.2016
comment
@DarjiJigar покажи мне свою вторую страницу и где ты используешь myAppDelegate.filteredArray покажи мне   -  person Vvk    schedule 15.02.2016
comment
@VvkAghera - (void)viewDidLoad {[super viewDidLoad]; AppDelegate *myAppDelegate = [[UIApplication sharedApplication] делегат]; NSLog(@new array=%@,myAppDelegate.filteredArray); // Выполните любую дополнительную настройку после загрузки представления. }   -  person Jigar    schedule 15.02.2016
comment
Давайте продолжим обсуждение в чате.   -  person Vvk    schedule 15.02.2016
comment
@DarjiJigar, пожалуйста, обновите код контроллера второго вида.   -  person Vvk    schedule 15.02.2016


Ответы (1)


Вам нужно обновить только - (IBAction)back:(id)sender в Second.m В настоящее время вы представляете SecondViewController из Viewcontroller.m. Когда вы возвращаетесь из Second.m в First, вы нажимаете первый контроллер просмотра. вы выделяете новый. он создаст новую ссылку вместо старой, поэтому ваше старое значение не будет получено. Замените свой метод - (IBAction)back:(id)sender приведенным ниже кодом.

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

OR

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

Предложение: для хранения и передачи массива в другой Viewcontroller вам не нужно использовать классы AppDelegae, NSUserDefault или Singletone. Напрямую вам нужно передать массив из одного VC в другой VC. т.е. ниже кода.... SecondVC.h

#import <UIKit/UIKit.h>

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

FirstVC.m здесь вы можете получить массив второго VC, используя secondVC'sObj.arrayname и добавить значение из первого CV в другой VC

- (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];
}
person Vvk    schedule 15.02.2016