Question

J'ai une application simple avec deux entités:

Personne:

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

Langue:

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

Sur l'écran d'édition pour les gens, j'ai un écran de table dressée à la liste des langues non indigènes inscrite pour la personne, ainsi que d'une boîte de dépôt pour eux de choisir une autre langue et un bouton pour ajouter la nouvelle langue la liste.

Mon but est de créer une fonction comme suit:

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

et associez l'action du bouton. Trick est, alors que je sais comment assigner et modifier les variables régulières, je ne sais pas comment modifier le contenu des données de base à l'extérieur de Interface Builder. Comment puis-je faire en Objective-C?

Était-ce utile?

La solution

Dans toutes mes classes d'entités de modèle de données de base, je le code suivant pour à plusieurs manipulations de la relation:

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

Ce code de modèle est de très excellente mogenerator (qui génère automatiquement de façon appropriée sur chaque enregistrement du modèle de données).

En outre, notez que le backend de base de données pour à-plusieurs est non ordonnée. Si vous voulez garder un ordre à vos données, vous devez le faire vous-même.

Autres conseils

Vous devrez d'abord trouver l'instance ManagedObject / enregistrement que vous voulez. La façon rapide et sale est de demander à l'élément d'interface qui affiche l'objet personne qui objet qu'elle a.

Une fois que vous avez l'objet que vous utilisez mutableSetValueForKey: d'appel avec le nom de la relation. Cela vous donne un ensemble mutable de tous les languges connexes. Vous allez chercher ensuite l'objet langage approprié et l'ajouter à l'ensemble à l'aide des méthodes standard NSMutableSet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top