Como pode um estado marca ser salvos em dados do núcleo?
-
19-09-2019 - |
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
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
- O usuário clica em uma linha
- tableView:. DidSelectRow ... método altera a propriedade "isDone" do objeto gerenciado apropriado
- avisos os resultados buscados controlador que um objeto gerenciado mudou e chama o método
controllerDidChangeContent
em seu delegado. - O meu método
controllerDidChangeContent
apenas recarrega todos os dados na exibição de tabela - 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.