1

Je suis assez nouveau dans le langage objectif-c (moins de trois mois) mais c'est quelque chose que j'ai vraiment besoin de comprendre. Supposons qu'il existe un contrôleur (dans un environnement iOS) qui gère une vue de table pour les données d'entrée de l'utilisateur. La table doit avoir des cellules éditables et certaines fonctionnalités pour faciliter la sélection de la valeur, par exemple un bouton qui affiche un popover avec les valeurs possibles pour un champ.objectif-c délégués et conception d'événements (je ne comprends pas)

Supposons qu'il existe un champ pour stocker les noms de pays. Le popover montre d'abord une liste de continents; Lorsque l'utilisateur sélectionne un continent, le contrôleur du popover doit montrer les pays du continent sélectionné.

Maintenant, ce popover apparaît à plusieurs endroits dans l'application, donc ce sera bien si je peux l'encapsuler pour une utilisation ultérieure. Ce que je vais attendre pour ce popover est quelque chose comme ceci:

... 
@protocol MyPopoverDelegate<NSObject> { 
-(void)didSelectCountry:(NSString *)countryName; 
{ 
... 
MyPopoverController *dataSelector = [[MyPopoverController] alloc] init]; 
dataSelector.dataType = CountryDataType; 
dataSelector.delegate = self; 
[dataSelector show]; 
[dataSelector release]; 
... 

Le problème ici est la ligne [dataSelector release] parce que le code de gestion du popover doit rester en vie jusqu'à ce que le pays est sélectionné. Cela signifie que la variable dataSelector doit être une propriété de la classe appelant et c'est nul.

La question est alors: Comment puis-je organiser des situations comme celle-ci pour avoir un contrôleur réutilisable?

Merci

Edité après vodkhang Réponse:

Ok, c'est un bon, mais dataSelector est encore une propriété. Que faire si je:

@implementation MyPopoverController 

- (id)init { 
... 
[self retain]; 
... 
} 

- (void)popoverControllerDidDismissPopover: (UIPopoverController *)popoverController { 
... 
[delegate didFinishSelectingCountry:countryName]; 
[self release]; 
} 

@end 

Je ne vois jamais ce comportement en c objectif, je pense que ce n'est pas l'idée. Pourquoi est-ce faux?

+0

Réponse possible: la section "À propos des contrôleurs de vue personnalisés" dans http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/AboutViewControllers/AboutViewControllers.html –

Répondre

1

Une des façons que vous pouvez faire pour la méthode de délégué est d'avoir:

MyPopOverDelegate 
    - (void)didFinishSelectingCountry:(NSString *)countryName popOver:(MyPopOver *)popOver; 
    Caller.m 

// the caller 
- (void)viewDidLoad { 
MyPopoverController *dataSelector = [[MyPopoverController] alloc] init]; 
dataSelector.dataType = CountryDataType; 
dataSelector.delegate = self; 
[dataSelector show]; 

} 

- (void)didFinishSelectingCountry:(NSString *)countryName popOver:(MyPopOver *)popOver { 
    // finish stuff 
    [popOver release]; 
} 

De cette façon est beaucoup utilisé comme NSURLConnection, UIImagePickerController

0

Si vous voulez un peu réutilisable d'objet unique à travers une application entière De n'importe où dans la hiérarchie de vue, vous pouvez en faire une propriété du délégué de l'application, et laisser l'application la posséder (la conserver en direct, la relâcher pendant les avertissements de la mémoire, etc.).

Un objet auto-retenu peut éventuellement rencontrer des problèmes si vous transférez votre code dans un environnement collecté.

Questions connexes