Pergunta

Eu tenho um aplicativo lista onde os usuários apertar o botão + e entrar em um item que eles querem aparecer na lista e clicar em salvar. A tabela é salvo com dados núcleo. O único problema é quando a célula é gravada eu quero uma marca a ser exibida. Ive habilitado seleção múltipla com

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

Eu gostaria que as marcas de verificação a ser persistiu na célula após as saídas de usuário. Eu criei um atributo na minha entidade chamada "cheques" e deu-lhe o tipo de boolean, mas não sei como fazê-lo, onde se você bater uma linha, em seguida, uma seleção aparece e é persistente. Qualquer ajuda seria muito apreciada. Graças

Foi útil?

Solução

Isto é como eu fazê-lo. Um ponto notável: não CoreData não armazenar booleans, portanto, qualquer propriedade denominada "boolean" é realmente do tipo NSNumber. Você tem que se lembrar para converter e para trás quando se trata de CoreData e valores booleanos.

- (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"];
    }
}

Eu tenho meu set UITableViewController como o delegado para o NSFetchedResultsController, por isso as alterações que fiz aos objetos gerenciados na consulta ^^^ fará com que os dois métodos a seguir para ser executado.

- (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;
}

Veja como tudo laços juntos

  1. O usuário clica em uma linha
  2. tableView:. DidSelectRow ... método altera a propriedade "isDone" do objeto gerenciado apropriado
  3. avisos os resultados buscados controlador que um objeto gerenciado mudou e chama o método controllerDidChangeContent em seu delegado.
  4. O meu método controllerDidChangeContent apenas recarrega todos os dados na exibição de tabela
  5. Quando o tableView é recarregado, meu tableView:. CellForRow ... método verifica a propriedade "isDone" do item conseguiu ver se a célula deve ter uma marca de seleção ou não

E só assim você não ficar confuso, eu inicialmente utilizado um NSMangagedObject genérico para estado loja de linha, que é por isso que o primeiro método que eu postei diz, [selectedObject valueForKey:@"isDone"]. Mais tarde mudei para um objeto gerenciado subclasse chamada JKItem, razão pela qual o segundo conjunto de métodos é capaz de usar item.isDone sem gerar um aviso do compilador.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top