Подробный вид -> Объекты -> NSMutableArray -> NSUserDefaults
Я знаю, что об этом спрашивали миллион раз, но я напутал...
Поэтому в основном я пытаюсь отправить объект из подробного представления в избранное со всеми его свойствами.
У меня уже есть кнопка, работающая, чтобы добавить строку [одно свойство объекта] в избранное
Код нажатой кнопки:
- (void)buttonPressed:(id) sender
{
NSMutableArray *favss = [[[NSUserDefaults standardUserDefaults] objectForKey:@"Favorite"]mutableCopy];
if(favss != nil)
{
NSLog(@"Array found. Contents: %@",favss);
}
else
{
favss = [[NSMutableArray alloc] initWithCapacity:0];
}
[favss addObject:self.word.head];
[[NSUserDefaults standardUserDefaults] setObject:favss forKey:@"Favorite"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSLog(@"Number of items in my array is: %d", [favss count]);
}
мой объект хранится в своем собственном классе:
@interface Words : NSObject {
NSString *head;
NSString *pro;
NSString *def;
}
@property(nonatomic, copy) NSString *head;
@property(nonatomic, copy) NSString *pro;
@property(nonatomic, copy) NSString *def;
при попытке бежать [favss addObject:self.word]
приложение явно взволновано, потому что объекты не могут быть добавлены в NSUserDefaults
- поэтому я попробовал NSCoding, но это превратило все мое представление в детали в ЧЕРНОЕ - я попытался отправить свои три строки отдельно, и это нормально, но тогда они все полностью отделены друг от друга, что побеждает цель - и я каким-то образом заканчиваю тем, что полностью подставляю мои массивы со всем другим кодом, который я пробовал, потому что теперь я продолжаю получать эту ошибку:
Array found. Contents: <62706c69 73743030 d4010203 0405081d 1e542474 6f705824 6f626a65 63747358 24766572 73696f6e 59246172 63686976 6572d106 0754726f 6f748001 a6090a13 14151655 246e756c 6cd40b0c 0d0e0f10 11125468 65616456 24636c61 73735370 726f5364 65668002 80058003 8004615d f4536261 316f10cd 005b0070 00612075 2075005d 00202460 7c98003b 00208d34 002025b7 59277ea2 559c62a5 ff5e4e0a 58993002 24615207 54080020 25b77b54 662f7b54 5f978d77 ff0c5c31 60154e0d ff5e9898 30022462 63287740 002025b7 524d4e0d ff5e6751 ff0c540e 4e0dff5e 5e973002 24639644 7740003b 00208ddf 968f0020 25b7674e 5f3a83ab 5f977968 ff0cff5e 50127535 5f719662 76848001 738b5165 4e86573a 30022464 62767740 002025b7 624bff5e 95e8678b 5f805916 770b3002 24656cbf 7740003b 0020987a 77400020 25b74f60 ff5e6cb3 8fb95f80 4e0b8d70 ff0c4e0d 8fdc5c31 662f4e5d 773c6865 30022466 4eb28fd1 002025b7 4f607231 5a03513f ff0c5a03 513f5c31 ff5e4f60 30022467 72758fde 002025b7 90a35e74 5b506211 72385173 8fdb0020 201c725b 68da201d ff0c5f20 53d453d4 89c15230 62118fde 740690fd 4e0d7406 ff0c751f 6015628a 4ed6ff5e 50124e86 30022468 5df47ed3 002025b7 4f604ee5 4e3a628a 79d1957f ff5e5012 5c316709 597d5904 55e6003f 00202469 7167987e 003a0020 89c10020 201c5df4 5bb6201d 3002d217 18191c58 24636c61 73736573 5a24636c 6173736e 616d65a2 1a1b5557 6f726473 584e534f 626a6563 7455576f 72647312 000186a0 5f100f4e 534b6579 65644172 63686976 65720008 00110016 001f0028 00320035 003a003c 00430049 00520057 005e0062 00660068 006a006c 006e0071 00750212 02170220 022b022e 0234023d 02430248 00000000 00000201 00000000 0000001f 00000000 00000000 00000000 0000025a>
По сути, я просто хочу, чтобы моя кнопка добавляла объект, отображаемый в подробном представлении, в массив, который передается в NSUserDefaults для отображения в табличном представлении на другой стороне (который затем можно выбрать для отображения подробностей каждого снова объект)... и я знаю, что об этом спрашивали много, но... ну, я даже не могу показать свой массив в данный момент...
2 ответа
Я сделал это так в конце концов:
- (void)apopbuttonPressed:(id) sender
{
NSMutableArray *myfavs = [[[NSUserDefaults standardUserDefaults] objectForKey:@"MyFavoritez"]mutableCopy];
if(myfavs != nil)
{
NSLog(@"Array found. Contents: %@",myfavs);
}
else
{
myfavs = [[NSMutableArray alloc] initWithCapacity:0];
}
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"MyFavoritez"];
if (dataRepresentingSavedArray != nil)
{
NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
if (oldSavedArray != nil)
_myfavs = [[NSMutableArray alloc] initWithArray:oldSavedArray];
else
_myfavs = [[NSMutableArray alloc] init];
}
[_myfavs addObject:self.word];
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:_myfavs] forKey:@"MyFavoritez"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSLog(@"Number of items in my array is: %d", [_myfavs count]);
// [self performSegueWithIdentifier:@"passFavs" sender:favs];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([[segue identifier] isEqualToString:@"passFavs"]) {
FavViewController *con = segue.destinationViewController;
con.myFavsTwo = _myfavs; }
}
а также
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
myFavsTwo = [NSKeyedUnarchiver unarchiveObjectWithData:[[[NSUserDefaults standardUserDefaults] objectForKey:@"MyFavoritez"] mutableCopy]];
[self.tableView reloadData];
NSLog(@"Number of items in my array is: %d", [myFavsTwo count]);
}
на случай, если кто-то столкнется с подобными проблемами
Если я вас правильно понимаю, вам нужно хранить массив объектов (Word), который имеет 3 значения (head, pro, def).
Я предлагаю вам сохранить эти три значения в NSDictionary: head="xxx" pro="yyy" def="zzz"
и затем вы сохраняете этот NSDictionary в массиве, который затем сохраняется в NSUserDefaults.
Если вы непреклонны в хранении своих пользовательских объектов, вам нужно немного их расширить.
Ответ на эти вопросы SO должен получить вас там: Как хранить пользовательские объекты в NSUserDefaults