Pergunta

Eu tenho uma aplicação simples com duas entidades:

Pessoa:

Attributes:
    name
Relationships:
    nativeLanguage: (<<-> Language.natives)
    nonNativeLanguage: (<<-> Language.nonNatives)

Idioma:

Attributes:
    name
Relationships:
    natives: (<->> Person.nativeLanguage)
    nonNatives: (<->> Person.nonNativeLanguage)

Na tela de edição para as pessoas, eu tenho um conjunto de exibição tabela para listar as línguas não-nativos listados para a pessoa, juntamente com uma caixa suspensa para que eles escolham outra língua e um botão para adicionar a nova linguagem para a lista.

Meu objetivo é criar uma função da seguinte forma:

- (IBAction)addNonNativeLanguage:(id)sender {
    // tack the language to the end of the list on a many-many relationship
    PersonEntry.nonNativeLanaguages = PersonEntry.nonNativeLanguages + sender;
}

e anexar a ação para o botão. Truque é, enquanto eu sei como atribuir e modificar variáveis ??regulares, eu não tenho nenhuma idéia de como modificar o conteúdo de fora Core Data de Interface Builder. Como posso fazê-lo em Objective-C?

Foi útil?

Solução

Em todas as minhas classes de entidade modelo Core Data, eu tenho o seguinte código para o para-muitos manipulação:

- (void)addNatives:(NSSet*)value_ {
    [self willChangeValueForKey:@"natives" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value_];
    [[self primitiveValueForKey:@"natives"] unionSet:value_];
    [self didChangeValueForKey:@"natives" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value_];
}

-(void)removeNatives:(NSSet*)value_ {
    [self willChangeValueForKey:@"natives" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value_];
    [[self primitiveValueForKey:@"natives"] minusSet:value_];
    [self didChangeValueForKey:@"natives" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value_];
}

- (void)addNativesObject:(Person*)value_ {
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value_ count:1];
    [self willChangeValueForKey:@"natives" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"natives"] addObject:value_];
    [self didChangeValueForKey:@"natives" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (void)removeNativesObject:(Person*)value_ {
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value_ count:1];
    [self willChangeValueForKey:@"natives" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"natives"] removeObject:value_];
    [self didChangeValueForKey:@"natives" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (NSMutableSet*)nativesSet {
    [self willAccessValueForKey:@"natives"];
    NSMutableSet *result = [self mutableSetValueForKey:@"natives"];
    [self didAccessValueForKey:@"natives"];
    return result;
}

Este código do modelo é de Wolf Rentzsch é muito excelente mogenerator (que gera automaticamente-lo adequadamente sobre cada save do modelo de dados).

Além disso, nota que o Núcleo de Dados backend para relacionamentos para muitos é desordenado. Se você quiser manter uma ordem aos seus dados, você tem que fazê-lo sozinho.

Outras dicas

Você primeiro tem que encontrar a instância managedObject / gravar quiser. A maneira rápida e suja é pedir o elemento de interface que está exibindo o objeto pessoa qual objeto tem.

Depois de ter o objeto que você usar a chamada mutableSetValueForKey: com o nome do relacionamento. Isto dá-lhe um conjunto mutável de todas as languges relacionados. Você, então, buscar o objeto linguagem adequada e adicioná-lo ao conjunto usando os métodos NSMutableSet padrão.

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