2011-07-21 3 views
0

Прошу прощения за мой плохой английский, но я пытаюсь объяснить наилучшими словами.NSMutableArray в NSUserDefaults

У меня есть проблема, когда я пытаюсь вставить NSMutableArray в NSUserDefaults ([NSUserDefaults setObject:forKey:]: Попытка вставить значение неимущественного «)

Моего кода для вставки массива выглядит следующим образом:

-(void)saveToUserDefaults:(NSMutableArray*)myArray 
{ 
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
    NSArray *array = [[NSArray alloc ] initWithArray:myArray]; 

    if (standardUserDefaults) 
     { 
      [standardUserDefaults setObject:array forKey:@"MyArray"]; 
      [standardUserDefaults synchronize]; 
     } 

} 

Мой код, чтобы получить массив:

-(NSMutableArray*)retrieveFromUserDefaults 
{ 
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
    NSMutableArray *val = [[NSMutableArray alloc]init]; 

    if (standardUserDefaults) 
      val = [NSMutableArray arrayWithArray:[standardUserDefaults arrayForKey:@"MyArray"]]; 

    return val; 

}

и в моем коде:

NSMutableArray:

series = [[NSMutableArray alloc]initWithObjects:nil]; 
//add some object inf my array... 

Сохранить мой NSMutableArray:

[self saveToUserDefaults:series]; 

Получить мой NSMutableArray:

series = [self retrieveFromUserDefaults]; 

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

Спасибо за чтение.

Tommy

+0

Могу ли я иметь полный код реализации – jkk

ответ

8

только неизменный NSArray s может быть помещен в значения по умолчанию. Вместо размещения там NSMutableArray, конвертируйте в обычный массив с помощью [NSArray arrayWithArray:] и поместите его по умолчанию.

Для извлечения, получения NSArray, а затем используйте [NSMutableArray arrayWithArray:].

+0

Я не могу сделать NSArray * массив = [[NSArray Alloc] arrayWithArray: туАггау]; –

+0

@tommy 'arrayWithArray' - метод класса; сначала не вызывайте alloc. '[NSArray arrayWithArray: myArray]' – highlycaffeinated

+0

@tommy: либо это, либо '[[NSArray alloc] initWithArray: myArray]'. Два способа не эквивалентны: первый создает автореализованный объект, второй - позже. –

0

Содержимое вашего массива может только Plist действительными объектами: (NSString, NSNumber, NSDate, NSData, NSArray или NSDictionary объекты).

См документации NSUserDefaultssetObject:forKey: и What is a Property List?

0

Вы можете использовать следующий метод, чтобы получить изменяемый объект из неизменны. Он не оптимизирован и реализован только для NSArray и NSDictionary.

+ (id) GetMutable:(id)input { 
    id result; 
    if ([input superclass] == [NSArray class] || [input superclass] == [NSMutableArray class]) { 
     result = [[NSMutableArray alloc] initWithArray:input copyItems:YES]; 

     for (int i = 0; i < [(NSMutableArray*)result count]; i++) { 
      [(NSMutableArray*)result replaceObjectAtIndex:i withObject:[Globals GetMutable:[(NSMutableArray*)result objectAtIndex:i]]]; 
     } 
    } else if ([input superclass] == [NSDictionary class] || [input superclass] == [NSMutableDictionary class]) { 
     result = [[NSMutableDictionary alloc] initWithDictionary:input copyItems:YES]; 

     NSArray *keys=[(NSMutableDictionary*)result allKeys]; 

     for (int i = 0; i < keys.count; i++) { 
      [(NSMutableDictionary*)result setObject:[Globals GetMutable:[(NSMutableDictionary*)result objectForKey:[keys objectAtIndex:i]]] forKey:[keys objectAtIndex:i]]; 
     } 

    } 
    else { 
     return input; 
    } 
    return result; 
} 
0

Я надеюсь this учебник помогает, кто ожидает ответа на этот вопрос.

-(void)saveToUserDefaults:(NSString*)myServerName uname:(NSString*)myUserName 
    pass:(NSString*)myPassword 
    { 
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 

    if (standardUserDefaults) { 
    [standardUserDefaults setObject:myServerName forKey:@"ServerKey"]; 
    [standardUserDefaults setObject:myUserName forKey:@"UserNameKey"]; 
    [standardUserDefaults setObject:myPassword forKey:@"PasswordKey"]; 
    [standardUserDefaults synchronize]; 
    } 
} 
-(NSArray*)retrieveFromUserDefaults 
{ 
    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
    NSString *serverName = nil; 
    NSString *userName = nil; 
    NSString *password = nil; 
    if (standardUserDefaults) 
    serverName = [standardUserDefaults objectForKey:@"ServerKey"]; 
    userName = [standardUserDefaults objectForKey:@"UserNameKey"]; 
    password = [standardUserDefaults objectForKey:@"PasswordKey"]; 

    NSArray* credentials = [NSArray arrayWithObjects:serverName,userName,password, nil]; 
    return credentials; 
} 

передавать значения

[self saveToUserDefaults:serverVariable uname:usernameVariable pass:passVariable]; 

Чтобы получить значение

NSArray *result=[self retrieveFromUserDefaults]; 

День кодирование !!!

0

Ваш код нуждается в большом количестве очистки.Вот простой и правильный способ доступа к стандартным по умолчанию пользователя:

  1. Значение вы передаете ваш сохранить метод не должен быть изменяемым, хотя это может быть. Но поскольку вы не мутируете его внутри своего метода, нет необходимости в его изменчивости. Он просто должен быть не нулевым, что вы будете проверять перед сохранением:

    - (Недействительными) saveToUserDefaults: (NSArray *) MyArray { если (MyArray) { NSUserDefaults * myDefaults = [NSUserDefaults standardUserDefaults]; myDefaults [@ "myArray"] = myArray; } }

  2. Стандартные значения по умолчанию пользователь только возвращает ненулевое изменяемые объекты, которые можно преобразовать в изменяемую копию, используя метод "mutableCopy":

    - (NSMutableArray *) retrieveFromUserDefaults { NSUserDefaults * myDefaults = [NSUserDefaults standardUserDefaults]; NSMutableArray * val = [[NSMutableArray alloc] init]; val = [myDefaults [@ "MyArray"] mutableCopy]; return val; }

+0

Извинения за форматирование блокированного кода. Ни ctrl-K, cmd-K, ни {} не работают для меня. –

Смежные вопросы