2015-03-16 2 views
-2
@property (strong, nonatomic)NSMutableArray *billsArray;

AddObject для NSMutableArray не работает

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.billsUserDefault = [NSUserDefaults standardUserDefaults]; 
    self.billsArray = [[NSMutableArray alloc] init]; 
    self.billsArray = [self getBillsArray]; 

} 


- (NSMutableArray *)getBillsArray { 
    NSMutableArray *billsArr = [self.billsUserDefault objectForKey:@"billArray"]; 
    return billsArr; 
} 


- (void)AddOneBill:(Bill *)bill { 
    // add bill to array 
    [self.billsArray addObject:bill]; 

    // store the new bill 
    [self.billsUserDefault setObject:self.billsArray forKey:@"billArray"]; 
    [self.billsUserDefault synchronize]; 

    // reload the table view 
    [self.billTableView reloadData]; 

} 

Метод addObject в addOneBill: метод не работает.

У меня проблема с той же проблемой, что и другие. В ответах предложено добавить [[NSMutableArray alloc] init] для изменяемой массива. Я сделал, но не работал.

ответ

0
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.billsUserDefault = [NSUserDefaults standardUserDefaults]; 
    self.billsArray = [[NSMutableArray alloc] init]; 
    self.billsArray = [self getBillsArray]; 

} 

В viewDidLoad вы звоните getBillsArray. Но какое значение в userDefauls для key-billArray вы получите, чтобы попасть в viewController?

Вы устанавливаете массив для этого ключа в методе addOneBill. Итак, в viewDidLoad вы создаете mutableArray: self.billsArray = [[NSMutableArray alloc] init];

, а затем установите его здесь: self.billsArray = [self getBillsArray];

+0

self.billsArray - источник данных UITableView, поэтому, когда представление действительно загрузилось, представление таблицы должно загружать существующие счета в self.billsArray – CokileCeoi

+0

Как вы догадались, что произойдет, если это первая загрузка? –

+0

Хорошо, я должен проверить, есть ли у элемента сначала элементы. – CokileCeoi

0

Попробуйте NSMutableArray *billsArr = [[self.billsUserDefault objectForKey:@"billArray"] mutableCopy]; в getBillsArray

+0

Это не работает. – CokileCeoi

+0

Затем попробуйте @NJGadhiya ответ. Создайте свой экземпляр 'billsArr', чтобы он изменялся. – ryancrunchi

0

NSUserDefaults объектов не не изменяемые. Вы должны сделать их изменчивыми.

пробуйте следующий код.

NSMutableArray *billsArr = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"billArray"]]; 
+0

Работает метод addObject, но приложение прекращено: Список свойств недопустим для формата: 200 (списки свойств не могут содержать объекты типа «CFType») Попытка установить объект, не являющийся объектом свойств («<Билл: 0x7fc151c0adb0> ") в качестве значения NSUserDefaults/CFPreferences для ключевого слова billArray *** Завершение приложения из-за неотображенного исключения« NSInvalidArgumentException », причина:« Попытка вставить объект списка объектов без свойства («») для ключа billArray ' – CokileCeoi

+0

возможно ключевой момент проблемы: NSUserDefault не может хранить массив пользовательских объектов. – CokileCeoi

+0

Вы можете хранить только свойства в userDefaults, вы храните объект класса Bill. Это ошибка. Если вы хотите хранить объекты в plist или userDefaults, вам необходимо их архивировать, используя 'NSKeyedArchiver' –

1

В вашем методе getBillsArray добавьте mutableCopy звонок для получения изменчивой матрицы для objectForKey. Поскольку объекты, полученные от NSUserDefaults, не изменяются. Модифицированный код будет выглядеть следующим образом:

- (NSMutableArray *)getBillsArray { 
    NSMutableArray *billsArr = [[self.billsUserDefault objectForKey:@"billArray"] mutableCopy]; 
    return billsArr; 
} 

EDIT: Вы добавляете пользовательские объекты в массиве и пытается сохранить в NSUserDefaults, которое не возможно. Вам нужно преобразовать объект в объект NSDictionary, в котором каждая пара значений ключа будет представлять одну переменную этого объекта. Вам придется рекурсивно выполнить этот шаг преобразования, если ваш пользовательский объект также содержит пользовательские объекты.

+0

Это не работает. – CokileCeoi

+0

добавьте точку останова, где вы добавляете объекты в свой массив. См. Тип 'billsArray' в области отладки. Проверьте, является ли тип 'NSMutableArray' или' NSArray' ?? –

+0

Тип __NSArrayM, возможно, ключевым моментом проблемы является то, что NSUserDefault не может хранить массив пользовательских объектов. – CokileCeoi

0

Другим решения: Для экспликации, почему он не работает, см ответа Салмана (Возвращаемые значения из NSUserDefaults не изменяемые)

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.billsUserDefault = [NSUserDefaults standardUserDefaults]; 
    self.billsArray = [[NSMutableArray alloc] init]; 
    [self.billsArray addObjectsFromArray: [self getBillsArray]]; 
} 


- (NSArray *)getBillsArray { 
    NSArray *billsArr = [self.billsUserDefault objectForKey:@"billArray"]; 
    return billsArr; 
} 

Для того, чтобы сохранить свои объекты «Билл» в NSUserDefaults, если он получен от NSObject, вы можете использовать NSKeyedArchiver & NSKeyedUnarchvier:

//encode 
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:your_bill_array]; 
//then save to NSUserDefaults 

//decode: 
id result = [NSKeyedUnarchiver unarchiveObjectWithData:data_returned_from_NSUSerDefaults]; 
+0

Я попробовал ваше решение, но приложение было прервано: Список свойств недействителен для формата: 200 (списки свойств не могут содержать объекты типа «CFType») Попытка установить объект не-свойство-списка ( « " ) в качестве значения NSUserDefaults/CFPreferences для ключа billArray ***, истекающего приложение из-за неперехваченное исключение„NSInvalidArgumentException“, причина:«Попытка вставить список неимущественного объект ( „<Билл: 0x7fc151c0adb0>“ ) для ключа billArray ' – CokileCeoi

+0

Есть еще одна проблема для вашего кода. NSUserDefaults принимает только примитивные типы данных (NSData, NSArray, NSString, ...). Ваш «Билл» - это настраиваемый объект, поэтому его нельзя вставлять непосредственно в NSUSerDefaults. Если Билл получен из NSObject, вы можете использовать NSKeyedArchiver & NSKeyedUnarchiver. (См. Мой обновленный ответ) –

+0

На этот раз приложение завершилось: - [Bill encodeWithCoder:]: непризнанный селектор, отправленный в экземпляр 0x7f990c00cc20 – CokileCeoi

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