Как сохранить состояние галочки в основных данных? - PullRequest
1 голос
/ 07 февраля 2010

У меня есть приложение со списком, в котором пользователи нажимают кнопку + и вводят элемент, который они хотят отобразить в списке, и нажимают кнопку Сохранить. Таблица сохраняется с основными данными. Единственная проблема заключается в том, что при приклеивании ячейки я хочу, чтобы отображалась галочка. Я включил множественный выбор с

UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath]; 
if (thisCell.accessoryType == UITableViewCellAccessoryNone) {
    thisCell.accessoryType = UITableViewCellAccessoryCheckmark;  
} else {
    thisCell.accessoryType = UITableViewCellAccessoryNone;
} 
[tableView deselectRowAtIndexPath:indexPath animated:NO]; 

Я бы хотел, чтобы флажки сохранялись в ячейке после выхода пользователя. Я создал в своей сущности атрибут, называемый «чеки», и дал ему тип логического значения, но я не знаю, как сделать его таким, где, если вы нажмете строку, то проверка появится и будет сохранена. Любая помощь будет принята с благодарностью. Спасибо

1 Ответ

7 голосов
/ 07 февраля 2010

Вот как я это делаю. Один заметный момент: CoreData не хранит логические значения, поэтому любое свойство, помеченное как «логическое», на самом деле имеет тип NSNumber. При работе с CoreData и логическими значениями вы должны помнить, что нужно конвертировать туда и обратно.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSManagedObject *selectedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];


    if ([[selectedObject valueForKey:@"isDone"] boolValue]) {
        [selectedObject setValue:[NSNumber numberWithBool:NO] forKey:@"isDone"];
    } else {
        [selectedObject setValue:[NSNumber numberWithBool:YES] forKey:@"isDone"];
    }
}

У меня установлен UITableViewController в качестве делегата для NSFetchedResultsController, поэтому изменения, которые я внес в управляемые объекты в запросе ^^^, приведут к запуску следующих двух методов.

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView reloadData];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *defaultCellIdentifier = @"Item";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:defaultCellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:defaultCellIdentifier] autorelease];
    }

    NSManagedObject *item = [[self fetchedResultsController] objectAtIndexPath:indexPath];
    cell.textLabel.text = [item valueForKey:@"name"];

    if ([[item valueForKey:@"checks"] boolValue]) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;
}

Вот как все взаимосвязано

  1. Пользователь нажимает на строку
  2. tableView: didSelectRow ... метод изменяет свойство «isDone» соответствующего управляемого объекта.
  3. контроллер извлеченных результатов замечает, что управляемый объект изменился, и вызывает метод controllerDidChangeContent в своем делегате.
  4. Мой метод controllerDidChangeContent просто перезагружает все данные в табличном представлении
  5. Когда tableView перезагружается, мой метод tableView: cellForRow ... проверяет свойство "isDone" управляемого элемента, чтобы увидеть, должна ли ячейка иметь галочку или нет.

И чтобы вы не запутались, я изначально использовал обобщенный NSMangagedObject для хранения состояния строки, поэтому первый опубликованный мной метод говорит: [selectedObject valueForKey:@"isDone"]. Позже я переключился на управляемый объект подкласса с именем JKItem, поэтому второй набор методов может использовать item.isDone без генерации предупреждения компилятора.

...