0

Très bien, je rencontre un problème avec mon code. Ce que j'ai fait est UIButton sous-classé afin que je puisse lui donner plus d'informations sur mon code. J'ai été capable de créer les boutons et ils fonctionnent très bien. Capiche. Cependant, l'une des choses que je veux que ma sous-classe contienne est une référence à un objet NSMangedObject. J'ai ce code dans mon fichier d'en-tête:Attribution d'un autre objet à NSManagedObject

@interface ButtonSubclass : UIButton { 
    NSManagedObjectContext *context; 
    NSManagedObject *player; 
} 

@property (nonatomic, retain) NSManagedObject *player; 
@property (nonatomic, retain) NSManagedObjectContext *context; 

- (id)initWithFrame:(CGRect)frame andTitle:(NSString*)title; 
//- (void)setPlayer:(NSManagedObject *)aPlayer; 

@end 

Comme vous pouvez le voir, il a une variable d'instance à la NSMangedobject Je veux que ça tienne (ainsi que le contexte). Mais pour la vie de moi, je ne peux pas l'obtenir pour tenir NSManagedObject. J'exécute les deux méthodes @synthesize dans le fichier d'implémentation.

@synthesize context; 
@synthesize player; 

Donc, je ne suis pas sûr de ce que je fais mal. Voici comment je crée mon bouton:

ButtonSubclass *playerButton = [[ButtonSubclass alloc] initWithFrame:frame andTitle:@"20"]; //works 

     playerButton.context = self.context; //works 
     playerButton.player = [players objectAtIndex:i]; //FAILS 

Et j'ai initilaized le tableau de joueurs plus tôt, où je reçois les objets. Une autre chose étrange est que quand il arrive à cet endroit dans le code, l'application plante (woot) et la sortie de la console s'arrête. Il ne me donne aucune erreur, et la notification à tous que l'application a planté. C'est juste ... arrête. Donc je ne sais même pas quelle est l'erreur qui écrase le code, d'ailleurs cela a à voir avec cette ligne qui définit la variable "player". Pensées et idées? J'adorerais ta sagesse!

+0

Pas vraiment lié à la question, mais vous n'avez pas besoin d'avoir une propriété pour le 'NSManagedObjectContext' - vous pouvez simplement utiliser la propriété' managedObjectContext' de l'objet 'player'. – shosti

Répondre

2

Il n'y a aucune raison particulière pour laquelle le code que vous avez ne devrait pas fonctionner. Vous pouvez affecter une occurrence de NSManageObject en tant qu'attribut. L'explication la plus simple pour l'incident est une erreur hors limites pour le tableau. Lorsque vous n'obtenez pas une erreur des consoles, c'est généralement parce que le débogueur s'est écrasé. Cela est généralement dû à une sorte de récursivité qui provoque le débordement de la pile du débogueur. Toutefois, mettre la logique de données dans un élément de vue comme un bouton est très, très mauvaise pratique. Cela casse complètement le modèle de conception MVC et rendra votre code fragile et difficile à maintenir. Les éléments de l'interface utilisateur doivent être "stupides" et comprendre uniquement comment afficher les données qui leur sont transmises. Ils ne doivent pas être impliqués dans le suivi des données elles-mêmes. C'est la fonction du contrôleur et du modèle de données respectivement.

Idéalement, l'objet "player" doit être suivi par le modèle de données que le contrôleur lie ensuite au bouton d'interface utilisateur approprié ou autre élément d'interface utilisateur. La mise en place du suivi du lecteur dans le modèle de données rend la conception flexible, ce qui facilite son développement, sa réutilisation et sa maintenance.

+0

J'essayais de trouver un moyen de faire cela, quand j'ai finalement décidé que je pouvais utiliser l'attribut Tag sur les boutons pour les suivre. Merci! –

1

Essayez d'ajouter un code de débogage premier

ButtonSubclass *playerButton = [[ButtonSubclass alloc] initWithFrame:frame andTitle:@"20"]; //works 
playerButton.context = self.context; //works 
NSLog(@"total players: %d", players.count); 
NSLog(@"players: %@", [players objectAtIndex:i]); 
playerButton.player = [players objectAtIndex:i]; //FAILS 

cela révèle probablement l'erreur

+0

+1 C'est un bon moyen de trouver l'erreur présumée hors limites. – TechZen

0

Vous ne pouvez pas créer le contexte d'objet géré simplement en le déclarant propriété et en ajoutant @synthesize.Le contexte de l'objet géré est créé par le délégué de l'application et que vous appelez comme ceci:

[[NSApp delegate] managedObjectContext]; 

je ne sais pas comment vous initialiser le tableau de joueurs, mais je soupçonne qu'il ne contient pas les objets que vous pensez qu'il ne: NSManagedObjectContext ne dispose que des méthodes qui renvoient NSSet et de tout

[[[NSApp delegate] managedObjectModel] entities]; 

ne retourne un tableau, il contient des instances de NSEntityDescription. Je vous suggère de commencer par examiner le code du délégué d'application de votre application (AppDelegate.m) pour en savoir plus sur les points d'entrée du magasin de données principales.

Questions connexes