Можете ли вы редактировать основные данные на ListViewController - PullRequest
0 голосов
/ 21 ноября 2010

У меня есть приложение Core Data, настроенное с ListViewController, DetailViewController и EditingViewController, где происходит большая часть редактирования. На ListViewController у меня есть графическое изображение флажка, и я могу переключать два изображения, выбирая строку в

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

Можно ли отредактировать запись Core Data из ListViewController, чтобы я мог сделать свой выбор постоянным? Я не могу выработать синтаксис для выбора записи, редактирования и сохранения значения, которое просто переключится с истинного на ложное.

джон

Спасибо за быстрый ответ! Дополнительная информация после ответа 1. Ваше предположение верно. Я моделирую это приложение на образце CoreData Books. Я не использую кнопку, а использую два изображения для создания флажка и не отмечен флажок. Я добавил логическую «проверку» в мою сущность, заново создал файл заголовка и добавил файл заголовка в свой ListViewController. Вот упрощенная версия заголовочного файла datamodel.

@interface Patient :  NSManagedObject  
{
}

@property (nonatomic, retain) NSString * location;
@property (nonatomic, retain) NSNumber * check;
@property (nonatomic, retain) NSString * lastName;

@end

А вот моя модификация вашего кода:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

    NSManagedObject *entityObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
    if (![entityObject.check boolValue]) {
        entityObject.check = [NSNumber numberWithBool:YES];
        cell.imageView.image = [UIImage imageNamed:@"check.png"];
        }
    else {
        entityObject.check= [NSNumber numberWithBool:NO];
        cell.imageView.image = [UIImage imageNamed:@"uncheck.png"];
    }

Однако, это дает мне ошибку «Запрос на проверку элемента в чем-то, что не является структурой или объединением». Я проверил, что новый атрибут является логическим, и что файл заголовка импортирован в ListViewController. Какие-нибудь мысли?

Наконец, устраняет ли этот код необходимость сохранять entityObject.check в базе данных? Еще раз спасибо.

Ответы [ 2 ]

1 голос
/ 21 ноября 2010

Было бы неплохо получить более подробную информацию о том, что делает ваше приложение, прежде чем мы сможем предоставить более обоснованную рекомендацию.В любом случае, я сделаю несколько предположений, чтобы понять, поможет ли это ...

Во-первых, при работе со свойствами BOOL в Coredata важно помнить, что они на самом деле сохраняются как номера NSN, так что имейте это в виду, когдавам нужно проверить их значения и убедиться, что вы используете правильные методы.

Предполагая, что данные в вашем ListViewController заполняются CoreData, а ваша модель данных определяет сущность "Entity" с атрибутом типа BOOL, который называется«любимый», вот что вы можете попробовать:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

       NSManagedObject *entityObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
       if (![entityObject.favourite boolValue]) {
            entityObject.favourite = [NSNumber numberWithBool:YES];
            [self.yourToggleButton setSelected:YES]; // this assumes your checkbox is a UIButton and you want its view to be updated to checked when your BOOL == YES
        }
        else {
            entityObject.favourite = [NSNumber numberWithBool:NO];
            [self.watchListButton setSelected:NO];
        }

Выше предполагается, что у вас есть fetchedResultsController, который также заботится о получении данных из вашей базы данных CoreData.Если нет, я настоятельно рекомендую вам ознакомиться с одним из учебных пособий Apple (CoreData Books и CoreData Recipes), чтобы понять, как они работают, поскольку это сделает вашу жизнь намного проще - NSFetchedResultsController упрощает синхронизацию данных между различными представлениями, чточто-то, что вы должны будете рассмотреть специально, потому что вы разрешаете редактировать различные атрибуты в разных контроллерах представления.

Я надеюсь, что это помогает, но не стесняйтесь задавать любые дополнительные вопросы, если вам нужно.Ура, Рог

0 голосов
/ 22 ноября 2010

Я придумал немного другое решение, но пост Рога определенно поставил меня на правильный путь. У меня были некоторые проблемы с логическим синтаксисом, поэтому я изменил атрибут лица на строку и использовал вместо этого «N» и «Y». Я также обнаружил, что мне нужно сохранить значение, чтобы сделать его постоянным. Я ценю помощь.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // Establish connections
    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
    Patient *patient = [self.fetchedResultsController objectAtIndexPath:indexPath];
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

    // Toggle images and check value with each row tap
    if ([patient.check isEqualToString: @"N"] == YES) {
        cell.imageView.image = [UIImage imageNamed:@"check.png"];
        patient.check = @"Y";
    }
    else {
        cell.imageView.image = [UIImage imageNamed:@"uncheck.png"];
        patient.check = @"N";
    }

    // Save check value
    NSError *error = nil;
    if (![context save:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...