Organisation et communication entre classes
Core
Membre
J'ai une classe qui doit etre instanticiée une seule fois au démarrage de l'appli. Il s'agit en fait d'un "moteur MIDI"
J'ai des autres classes (des boutons) qui doivent acceder à la methode play par exemple de cet objet unique et déja existant.
Je ne vois pas trop comment faire appel a cet objet dans mes autres classes (sans creer une autre instance du moteur midi)
En espérant avoir été clair sur mon problème ...
Merci d'avance !
J'ai des autres classes (des boutons) qui doivent acceder à la methode play par exemple de cet objet unique et déja existant.
Je ne vois pas trop comment faire appel a cet objet dans mes autres classes (sans creer une autre instance du moteur midi)
En espérant avoir été clair sur mon problème ...
Merci d'avance !
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Si j'ai bien compris tu a un objet unique qui est ton moteur midi et tu voudrai pouvoir y acceder via les boutons qu tu a sur ton interface graphique.
Ton interface elle est bien relié a un controller ? si c'est le c'est il faut que ton controller possede une reference sur ton moteur(que tui lui passe lors de son initialisation par exemple) et apres tu apelle les fonctions de ton mteur dans les methode associé a tes boutons.
Voila j'espere avoir été clai(enfin au moins t'avoir aidé )
Plus en détail, il faut déjà faire dans IB un outlet (appelé par exemple moteurMidiClasse) entre la classe qui gère tes boutons et la classe du moteur midi. Ensuite, il faut faire un import du fichier d'interfaçage du moteur midi dans ta classe qui gère les boutons, puis par un code dans ce genre, tu dois pouvoir faire appel a ta méthode play.
[tt]
-(void)play:(id)sender
{
[moteurMidiClasse play:laMusique];
}
[/tt]
Donc deux soluces:
1) faire uniquement des méthodes de classe (+) et des variables 'static'
2) utiliser un singleton
Bingo c'est exactement ca !
Comment faire une reference a ce moteur ? c'est en fait l'essence meme de ma question
Merci !!
J'avais effectivement vu le singleton qui ressembler bcp à ma question mais n'ai pas compris comment faire reference a cet objet unique
tu peux m'en dire un peu plus à ce sujet ?
Une petite recherche sur ce même forum
-Dans ton MainMenu.nib, tu instancies un MoteurMidi
-Dans MoteurMidi.m:
Et chaque fois que dans une autre classe tu as besoin du moteur midi, tu peux faire
Voilà
+
Chacha
Merci !
Oui, mais c'est bien plus simple dans un cas comme celui-là , et ça a l'avantage énorme de pouvoir permettre très simplement de connecter des items du MainMenu à d'éventuelles IBAction du MoteurMidi.
J'entrevois des bugs bien sympa aussi :P
[tt]static id _sharedInstance;
@implementation
+(id)sharedInstance {
if (!_sharedInstance)
_shared = [[[self class] alloc] init];
return _sharedInstance;
}
-(id)init {
if (_sharedInstance) return [_sharedInstance retain];
//le code habituel
_sharedInstance = self;
return self;
}
[/tt]
Avec ça tu peux aussi initialiser à partir de IB, même dans autant de NIB que tu veux, aucun risque.
Quel genre de bugs ? ça m'intéresse, parce que si cette technique est mauvaise, j'aime autant le savoir, vu que je l'utilise...
Chacha, que se passe-t-il si dans une autre classe je fais:
En programmation, j'aime pas trop les jeux de hasard
[Fichier joint supprimé par l'administrateur]
whaou merci m'sieur !!
[edit]
en fait c'était tout con !!
Ok, bien vu !
J'avais peur de bugs plus sournois, genre qui ne sautent pas aux yeux au run-time. Mais celui-là fait quand même réfléchir, je vais p'têt revoir mon code.
Je le trouve déjà pas mal ! Si tu ne crées pas l'instance dans init, dans awakeFromNib, la valeur de moteurMidi dans:
MoteurMidi* moteurMidi = [MoteurMidi moteurMidi];
est indéterminé ... (nil ?)