NSMutableArray и NSUserdefaults выпускают iPhone - PullRequest
0 голосов
/ 15 марта 2012
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    NSUserDefaults *somet = [NSUserDefaults standardUserDefaults];

    NSMutableArray *anArr = [somet objectForKey:@"somedata"] ;

    NSLog(@"anArr::: %@",anArr);

}

-(IBAction)addsomething:(id)sender{

   if (something == nil) {
        array = [[NSMutableArray alloc] init];
    }
    NSLog(@"textfieldvalue::: %@", textfield.text);

    [array addObject:textfield.text];

    NSUserDefaults *something = [NSUserDefaults standardUserDefaults];

    [something setObject:array forKey:@"somedata"];

    array = [something objectForKey:@"somedata"];

    NSLog(@"array:: %@", array);

}

Используя приведенный выше код, я пытаюсь динамически сохранить данные в NSMutableArray, а затем сохранить их в NSUserDefaults.Но при получении его я получаю (ноль).Даже данные не сохраняются в массиве.

Как правильно сохранить данные?

EDITED:

2012-03-15 15:17:18.431 check[2686:40b] anArr::: (null)
2012-03-15 15:17:30.160 check[2686:40b] textfieldvalue::: a
2012-03-15 15:17:30.162 check[2686:40b] array::: (null)

Ответы [ 5 ]

3 голосов
/ 15 марта 2012

без обид, но твой код - большая куча дерьма.

  1. переменные с именем something бесполезны. Период.
  2. у вас есть переменная с именем что-то в вашем локальном методе. И у вас есть переменная с именем что-то, что является частью вашего класса. Предупреждения «локальные переменные скрывают переменную экземпляра» существуют по причине!
    Вероятно, отсюда и все твои проблемы. Я думаю, что вы действительно не понимаете концепцию локальных переменных. Если это так, вы должны прочитать больше об основных вещах Objective-C.
  3. Вы проверяете, есть ли что-то ноль, и затем вы не изменяете что-то, а выделяете массив. Эти двое не имеют ничего общего друг с другом. Не пишите такой код.

Я исправил это для вас:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSArray *anArr = [userDefaults objectForKey:@"somedata"];
    NSLog(@"anArr::: %@",anArr);
}

-(IBAction)addsomething:(id)sender{
    NSMutableArray *array = [[NSMutableArray alloc] init];
    NSLog(@"textfieldvalue::: %@", textfield.text);
    [array addObject:textfield.text];
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setObject:array forKey:@"somedata"];
    array = [userDefaults objectForKey:@"somedata"];

    // synchronize is only needed while debugging (when you use the stop button in Xcode)
    // you don't need this in production code. remove it for release
    [userDefaults synchronize];

    NSLog(@"array:: %@", array);
}

Однако, скорее всего, вы хотите сохранить объекты в массив, полученный из userDefaults. Это не будет работать с локальными переменными!

Вы бы использовали что-то вроде этого. Но не копируйте это дословно. Попытайтесь понять это и прочитайте больше о локальных переменных.

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
array = [[userDefaults objectForKey:@"somedata"] mutableCopy];
if (!array) {
    // create array if it doesn't exist in NSUserDefaults
    array = [[NSMutableArray alloc] init];
}
NSLog(@"array in viewDidLoad: %@",array);



NSLog(@"textfieldvalue::: %@", textField.text);
[array addObject: textField.text];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:array forKey:@"somedata"];

// synchronize is only needed while debugging (when you use the stop button in Xcode)
// you don't need this in production code. remove it for release
[userDefaults synchronize];
3 голосов
/ 15 марта 2012

Попробуйте следующий код может помочь вам ...

- (void)viewDidLoad
{
 [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

NSUserDefaults *somet = [NSUserDefaults standardUserDefaults];

NSMutableArray *anArr = [[NSMutableArray alloc] init];
 anArr = [somet objectForKey:@"somedata"] ;
[somet synchronize];

NSLog(@"anArr::: %@",anArr);

}

-(IBAction)addsomething:(id)sender{

NSLog(@"textfieldvalue::: %@", textfield.text);
//Here u have to check array is in memory allocate or not 
[array addObject:textfield.text];

NSUserDefaults *something = [NSUserDefaults standardUserDefaults];

[something setObject:array forKey:@"somedata"];
[something synchronize];

array = [something objectForKey:@"somedata"];

NSLog(@"array:: %@", array);

}
2 голосов
/ 15 марта 2012

Вам нужно позвонить [[NSUserDefaults standardUserDefaults] synchronize]; после того, как вы setObject:forKey.

[something setObject:array forKey:@"somedata"];
[something synchronize];
0 голосов
/ 15 марта 2012

попробуйте это, когда вы сохраняете значение в NSUserDefaults

- (void)savingObject:(NSString *)keyName data:(id)val
{
    NSData *dataVal = [NSKeyedArchiver archivedDataWithRootObject:val];
    [defaults setObject:dataVal forKey:keyName];
    [defaults synchronize];
}

, а затем, когда вы хотите получить это, используйте это

- (id)gettingObject:(NSString *)keyName
{
    NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:keyName];
    return [NSKeyedUnarchiver unarchiveObjectWithData:data];
}

я думаю, что это поможет вам

0 голосов
/ 15 марта 2012

добавить эту строку,

[something synchronize]

перед извлечением данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...