Добавление к NSUserDefaults - Начинающий - PullRequest
1 голос
/ 15 февраля 2012

Как вы сравниваете 2 NSMutableArray?

Разные люди могут сказать, что это дублирующий вопрос, но я не нашел решения своей проблемы после просмотра большей части SO-вопроса.

Существует объект Person, и у него есть поля Name, Age, Rank

У меня есть MutableArray, который будет сохранять данные из NSUserDefaults.тогда он увидит, содержит ли NSMutableArray этот конкретный объект.в противном случае он будет добавлен в NSUserDefaults.

. При добавлении объекта person в NSUserDefaults возникает некоторая проблема (я добавляю объект person через массив, см. код).

Когда я печатаю [data count], это всегда 0.Так что, возможно, он не будет добавлен в NSUserDefaults должным образом.Или я могу сделать какую-то ошибку.

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

            if (userDefaults ) {

                NSArray *arr= [userDefaults objectForKey:@"person"];

                data = [NSMutableArray arrayWithArray:arr];

NSLog (@"%i ", [data count]);

                if (! [data containsObject:self.person] ) {

                    [data addObject:self.person];

                    NSArray *personarr= [NSArray arrayWithArray:data];

                    [userDefaults setObject:personarr forKey:@"person"];

                    [userDefaults synchronize];

Ответы [ 4 ]

2 голосов
/ 15 февраля 2012

Если self.person является экземпляром класса Person, вы не можете поместить его в пользовательские настройки по умолчанию, даже внутри массива.Из документации NSUserDefaults:

Параметром значения могут быть только объекты списка свойств: NSData, NSString, NSNumber, NSDate, NSArray или NSDictionary.Для объектов NSArray и NSDictionary их содержимое должно быть объектами списка свойств.

Они предлагают this для дальнейшего чтения, в котором перечислены типы, которые считаются объектами списка свойств.

1 голос
/ 15 февраля 2012

Вы можете реализовать методы в своем классе Person для экспорта его данных в словарь и метод init для восстановления себя из этого же словаря.Как указывает Аморья, вы не можете вставить произвольный объект в NSUserDefaults.

0 голосов
/ 15 февраля 2012

Если вы получите массив из NSUserDefaults, он никогда не будет таким же указателем, как любой текущий объект (например, self.person) .. так что это никогда не сработает.Сравнение объектов с == сравнивает их адреса памяти.

Если вы хотите сравнить их, используйте их содержимое.(например. [[person objectForKey: @"Name"] isEqualToString: [person2 objectForKey: @"Name"]]).Поэтому вы должны сделать это в цикле и проверить, если имя нового человека уже существует.

Кроме того, arrayWithArray НЕ является инициализатором NSMutableArray.Поэтому, если он должен быть изменяемым, сделайте это так:

NSArray *arr= [userDefaults objectForKey:@"person"];
data = [[arr mutableCopy] autorelease];

И если ваш счетчик всегда равен нулю, проверьте фактическое содержимое массива и посмотрите, что внутри.Например, вот так:

NSArray *arr= [userDefaults objectForKey:@"person"];
CFShow(arr);
0 голосов
/ 15 февраля 2012

Вы сохраняете свой объект Person в NSArray, а затем NSArray в NSUserDefaults, но этого недостаточно.Вы должны сериализовать свой объект Person перед тем, как сохранить его в NSUserDefaults.

Этот пост объяснит это лучше, я думаю: Хранение пользовательских объектов в NSMutableArray в NSUserDefaults

Попробуйтев NSLog (@ "% @" self.person);до вашего заявления if, потому что я подозреваю, что это может быть ноль.

Надеюсь, это помогло вам.

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