основные данные для кнопки «добавить в избранное»? - PullRequest
1 голос
/ 18 июля 2010

Мне было трудно найти примеры / учебники / информацию для этого.Мне бы хотелось, чтобы в моем приложении была кнопка «Добавить в избранное».это взяло бы ячейку из одного табличного представления и заполнило бы эту ячейку в «любимое» табличное представление.основные данные правильное направление для приближения к этому?я видел некоторые подсказки об использовании nsmutablearray и / или nsuserdefaults.не совсем уверен, в какую сторону идти.Любой совет приветствуется.

Ответы [ 3 ]

4 голосов
/ 12 июня 2011

Я добавил эту функцию в детальный просмотр.У моей сущности есть «любимый» атрибут.Нажатие кнопки «Избранное» в подробном представлении устанавливает строку для атрибута «Избранное» и включает и выключает изображение звезды:

- (IBAction)flagButtonPressed:(id)sender {

    if (flagButtonSelected == 0) {

        [flagButton setSelected:YES];

        flagButtonSelected = 1;
        [flagButtonImage setImage:[UIImage imageNamed:@"yesFavorite.png"]];
        [myCoolEntity setValue:@"yesFlag" forKey:@"flagSet"];

    } else {

        [flagButton setSelected:NO];

        flagButtonSelected = 0;
        [flagButtonImage setImage:[UIImage imageNamed:@"noFavorite.png"]];
        [myCoolEntity setValue:@"noFlag" forKey:@"flagSet"];
    }

    NSManagedObjectContext *context = myCoolEntity.managedObjectContext;
    NSError *error = nil;
    if (![context save:&error]) {

        NSLog(@"Tried to save fav. Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

}

Затем в моем главном представлении таблицы у меня есть кнопка «Избранное» впанель навигации, которая выдвигает новый контроллер представления с помощью NSFetchedResultsController и предиката, который ищет все объекты, для которых атрибут «flagSet» установлен в «yesFlag».

- (NSFetchedResultsController *)fetchedResultsController {
    // Set up the fetched results controller if needed.
    if (fetchedResultsController == nil) {
        // Create the fetch request for the entity.
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        // Edit the entity name as appropriate.
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyCoolEntity" inManagedObjectContext:managedObjectContext];
        [fetchRequest setEntity:entity];

        NSPredicate *predicate = [NSPredicate predicateWithFormat: @"flagSet like 'yesFlag'"];      

        [fetchRequest setPredicate:predicate];

        //set batch size
        [fetchRequest setFetchBatchSize:20];

        // Edit the sort key as appropriate.
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
        NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

        [fetchRequest setSortDescriptors:sortDescriptors];

        // Edit the section name key path and cache name if appropriate.
        // nil for section name key path means "no sections".
        NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"name" cacheName:nil];
        aFetchedResultsController.delegate = self;
        self.fetchedResultsController = aFetchedResultsController;

        [aFetchedResultsController release];
        [fetchRequest release];
        [sortDescriptor release];
        [sortDescriptors release];
    }

    return fetchedResultsController;
}

Кроме того, в viewDidLoad для подробного представления Iотобразить изображение звезды на кнопке «Избранное» соответствующим образом:

//flag button   
    if ([myCoolEntity.flagSet isEqual:@"yesFlag"])  {

        [flagButtonImage setImage:[UIImage imageNamed:@"yesFavorite.png"]];
        [flagButton setSelected:YES];
        flagButtonSelected = 1;

    } else {

        [flagButtonImage setImage:[UIImage imageNamed:@"noFavorite.png"]];
        [flagButton setSelected:NO];
        flagButtonSelected = 0;
    }
2 голосов
/ 18 июля 2010

Базовые данные, вероятно, лучший путь, если вам нужно постоянное хранилище между сеансами пользователя. NSUserDefaults больше для - только это - пользовательские настройки по умолчанию. Хотя я думаю, что было бы целесообразно сохранить, скажем, домашнюю страницу пользователя в NSUserDefaults, что-то, что могло бы стать большим (например, избранное), должно, вероятно, помещаться в хранилище данных.

Если вам никогда не нужно искать в списке, и вы просто хотите сохранить и отобразить его, посмотрите также на plist-файлы. NSArray может записывать данные напрямую в файл plist с writeToFile:atomically:. Вы можете получить эти данные обратно с помощью arrayWithContentsOfFile:.

Если вы придерживаетесь вышеуказанного подхода, следует обратить внимание на одну вещь - arrayWithContentsOfFile: - это метод статического класса, а не метод экземпляра.

Базовые данные, тем не менее, являются наиболее гибким вариантом. Попробуйте шаблон приложения в XCode для «Приложения на основе навигации» с «Использовать базовые данные». Большая часть кода примера прямо здесь.

0 голосов
/ 12 июня 2011

Если количество фаворитов, вероятно, останется управляемым (скажем, до 100-200 или около того), вам, вероятно, лучше использовать подход NSUserDefaults. В этом случае я бы предложил использовать Core Data только в том случае, если у вас есть для этого другие потребности. Нетрудно использовать Core Data. Хранение данных в отдельном списке также является разумным подходом.

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

...