Obj-C méthode facile à convertir de NSObject avec des propriétés à NSDictionary?
J'ai couru à travers quelque chose que j'ai finalement compris, mais pense qu'il y a probablement une façon beaucoup plus efficace pour y parvenir.
J'ai eu un objet (un NSObject, qui a adopté la MKAnnotation protocole) qui a eu un certain nombre de propriétés (titre, sous-titre,la latitude,la longitude, info, etc.). J'avais besoin d'être en mesure de passer à cet objet à un autre objet, qui voulaient extraire des informations à partir de l'aide de objectForKey méthodes, comme un NSDictionary (parce que c'est ce qu'il se faisait à partir d'un autre point de vue contrôleur).
Ce que j'ai fait était de créer un nouveau NSMutableDictionary et l'utilisation setObject: forKey sur elle pour transférer chaque pièce essentielle de l'info, et puis je viens de passer sur le nouveau dictionnaire.
Y avait-il un plus facile façon de le faire?
Voici le code correspondant:
//sender contains a custom map annotation that has extra properties...
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showDetailFromMap"])
{
DetailViewController *dest =[segue destinationViewController];
//make a dictionary from annotaion to pass info
NSMutableDictionary *myValues =[[NSMutableDictionary alloc] init];
//fill with the relevant info
[myValues setObject:[sender title] forKey:@"title"] ;
[myValues setObject:[sender subtitle] forKey:@"subtitle"];
[myValues setObject:[sender info] forKey:@"info"];
[myValues setObject:[sender pic] forKey:@"pic"];
[myValues setObject:[sender latitude] forKey:@"latitude"];
[myValues setObject:[sender longitude] forKey:@"longitude"];
//pass values
dest.curLoc = myValues;
}
}
Merci d'avance pour votre sagesse collective.
Voici ce que j'ai trouvé, merci à vous les gens, ci-dessous...
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showDetailFromMap"])
{
DetailViewController *dest =[segue destinationViewController];
NSArray *myKeys = [NSArray arrayWithObjects:
@"title",@"subtitle",@"info",@"pic",@"latitude",@"longitude", nil];
//make a dictionary from annotaion to pass info
NSDictionary *myValues =[sender dictionaryWithValuesForKeys:myKeys];
//pass values
dest.curLoc = myValues;
}
}
Et un encore plus simple correctif, comme on le voit ci-dessous...
À l'aide de valueForKey à la place de l'objet de la clé pour récupérer les informations.
source d'informationauteur james Burns | 2012-04-25
Vous devez vous connecter pour publier un commentaire.
Si les propriétés ont les mêmes noms que les clés utilisés pour accéder au dictionnaire, alors vous pourriez juste KVC et avait
valueForKey:
au lieu deobjectForKey
.Par exemple à ce dictionnaire
et cet Objet
il ne serait pas question si j'avais une instance du dictionnaire ou
MyAnnotation
je pouvais l'appelerÉvidemment, cela fonctionne dans l'autre sens, p. ex.
Chose de sûre! Utiliser le objc-runtime et KVC!
Et vous l'utiliser comme ceci:
C'est un vieux post et Richard J. Ross III de réponse est vraiment utile, mais dans le cas d'objets personnalisés (une classe personnalisée a un autre objet personnalisé). Cependant, parfois, les propriétés sont d'autres objets, et ainsi de suite, faire de la sérialisation un peu compliqué.
Pour la conversion de ces types d'objets (plusieurs objets personnalisés) dans le dictionnaire, j'ai dû modifier Richard J. Ross III de la Réponse un peu.
J'espère que ça aidera quelqu'un. Pleine de crédit va à Richard J. Ross III.
Pour valider la méthode de Richard J. Ross, celui-ci fonctionne avec NSArray de l'objet personnalisé.
Il ya donc beaucoup de solutions et rien n'a fonctionné pour moi car j'ai eu un imbriquée complexe la structure de l'objet. Cette solution prend les choses de Richard et Damien, mais improvise comme Damien solution est liée au choix des noms des touches dans la classe des noms.
Voici l'en-tête
Ici est la .m fichier
Vous pouvez également utiliser le
NSObject+APObjectMapping
catégorie qui est disponible sur GitHub: https://github.com/aperechnev/APObjectMappingC'est un quitter facile. Juste décrire les règles de mappage dans votre classe:
Et puis vous pouvez facilement faire correspondre votre objet de dictionnaire:
Aussi, vous pouvez analyser votre objet à partir du dictionnaire: