2009-07-08 8 views
5

En un mot, comment?Méthodes d'instance appelant des méthodes de classe appelant des méthodes d'instance

J'ai un contrôleur de vue qui crée quelques objets personnalisés. L'un de ces objets doit rappeler une méthode dans le contrôleur. L'objet semble vouloir appeler une méthode de classe dans le contrôleur, ce qui peut être correct, sauf que la classe dans le contrôleur doit appeler une méthode d'instance dans le contrôleur, et il ne semble pas vouloir faire cela. Cela a-t-il du sens?

Sinon, voici le code pseudo:


ViewController.m 

#import "customObj.h" 
-(void)viewDidLoad{ 
    [email protected]"string";//declared in ViewController.h 
} 
-(void)createObj{ 
    [email protected]"different string"; 
    customObj *customObjInstance=[[customObj alloc] init]; 
} 

--- 

customObj.m 

#import "ViewController.h" 
-(void)callBack{ 
    [ViewController createObj]; 
} 

Ok, alors quand va callBack, il les erreurs, en disant qu'il cherche + createObj (non -createObj). Je peux changer createObj en une méthode de classe, mais ensuite il y a un problème pour paramétrer foobar parce que foobar a été initialisé dans -viewDidLoad, et je ne peux pas changer cela en + viewDidLoad. Je pourrais peut-être déplacer foobar dans une méthode de classe, mais comment puis-je l'appeler? Au lieu de moi-même, est-ce que je me réfère à [ViewController ...]? Je ne pense pas que cela fonctionne. Je pense qu'il me manque un concept de base et que ce n'est pas aussi difficile que je le fais. Je suis redevable à tous ceux qui peuvent me redresser.

Merci beaucoup.

Répondre

5

Il n'y a pas de réponse correcte unique; Cela dépend de la façon dont votre objet personnalisé interagit avec le contrôleur. La plupart des vues UIKit utilisent un modèle "cible-action" pour communiquer avec le contrôleur, tandis que beaucoup d'objets modèles utilisent le modèle délégué. Lequel vous utilisez dépend des spécificités de votre contrôleur et de votre objet personnalisé.

Cependant, mécaniquement, ce que vous auriez probablement besoin de faire est de passer un pointeur à votre ViewController lorsque vous créez le customObj via un initialiseur personnalisé, comme ceci:

customObj *customObjInstance = [[customObj alloc] initWithController: self]; 

Assurez-vous qu'il est logique pour votre customObj pour être étroitement couplé à votre contrôleur si vous faites cela.

+0

Hmm ... Merci. J'ai passé des pointeurs dans le passé, et il semble que ce soit un tel kluge que je ne pouvais pas imaginer que c'était la bonne façon de le faire. Donc un objet n'a aucune référence à l'objet qui l'a créé? Les autres langues avec lesquelles j'ai travaillé ont quelque chose comme 'parent' qui est distinct de la super classe de l'objet. Si j'ai un objet uiview qui crée un objet uitableview, cet objet tableview n'a aucune référence à l'instance uiview qui l'a généré? Cette omission en est une que je ne cesse de rencontrer. Merci encore. –

+0

Les vues ont le concept d'une 'superview', qui est la vue qu'elles sont contenues dans-mais il n'y a pas de concept général d'un" objet créant ". Généralement, vous décidez de la relation entre l'objet de contrôleur et l'objet de modèle. Dans votre cas, par exemple, vous pourriez décider qu'une instance de customObj a besoin d'un autre objet pour créer plus d'objets, et vous pourriez modéliser cela en utilisant un délégué (qui est, au fond, un pointeur vers un autre objet, mais c'est plus générique). Il existe toutes sortes de façons de le faire, et la meilleure façon dépend de votre situation particulière. –

+0

Si vous voulez qu'un objet ait un "parent", vous lui en donnez un. En général, je ne trouve pas que j'ai besoin d'un tel couplage spécifique. – Chuck

3

Vous m'avez peut-être jeté avec vous diverses mentions de classe à instance à classe, mais si tout ce que vous voulez dire est que le contrôleur doit créer des objets qui peuvent appeler le contrôleur (pour créer plus de la même chose) vous aider avec.

Je le fais un peu, en utilisant - comme l'a dit John - le modèle de délégation:

Définir un protocole pour les appels de l'objet au contrôleur: callBack

// CallBackDelegate.h 


#import <Foundation/Foundation.h> 

@protocol CallBackDelegate<NSObject> 
- (void)callBack; 
@end 

dans le fichier d'en-tête pour le contrôleur i importer le protocole

#import "CallBackDelegate.h" 

et précise que le contrôleur implémente ce protocole:

@interface MyViewController : UIViewController <CallBackDelegate> 
{ ... 

quant à lui dans l'en-tête de classe d'objet personnalisé importer également le protocole

#import "CallBackDelegate.h" 

et ajouter un membre d'une instance qui est conforme au protocole:

id<CallBackDelegate> delegate; 

et une propriété qui doit être assigner ne pas conserver ou vous aurez des retenues circulaires, le contrôleur et l'objet personnalisé se retiendraient, ce qui signifierait qu'ils ne se désengageraient jamais

@property(assign) id<CallBackDelegate> delegate; 

(ce membre ne doit pas être appelé délégué)

Ensuite, assurez-vous que lorsque votre contrôleur de vue crée l'objet personnalisé, il définit elle-même en tant que délégué

customObject.delegate = self; 

Puis, en votre objet personnalisé, vous êtes sûr de le faire:

[ delegate callBack]; 

espoir qui aide, tapis

Si vous recherchez l'exemple de code Apple, vous trouverez des exemples pour quelque chose comme:

[delegate touchesEnded: touches withEvent: event];

Bien sûr, si vous voulez que la méthode pour vous passer un identifiant à l'objet créé, la méthode n'a pas besoin de retourner (vide) comme dans mon exemple

si vous voulez vous pouvez écrire une méthode d'initialisation qui prend le délégué comme john également suggéré

customObj * customObjInstance = [[customObj alloc] initWithController: self];

inside initWithController le contrôleur que vous passez doit être affecté en tant que délégué

+0

En effet, la délégation est un modèle très commun utilisé dans beaucoup d'objectifs-C - et les protocoles sont la clé pour rendre cela facile. –

Questions connexes