Как можно сохранить состояние галочки в основных данных?

StackOverflow https://stackoverflow.com/questions/2215465

Вопрос

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

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

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

Это было полезно?

Решение

Вот как я это делаю.Один примечательный момент: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 без генерации предупреждения компилятора.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top