la mise en œuvre des délégués anonymes en Objective-C?

voix
22

Est-il possible de déclarer des implémentations anonymes des choses comme délégués à Objective-C. Je pense avoir le droit de la terminologie, mais voici un exemple java:

myClass.addListener(new FancyInterfaceListener({
    void onListenerInterestingAction(Action a){
        ....interesting stuff here
    }
});

Ainsi, par exemple pour gérer un appel UIActionSheet Je dois déclarer une autre méthode dans la même classe, ce qui semble un peu bête si je veux transmettre les données, parce que je dois stocker ces données en tant que variable globale. Voici un exemple de supprimer quelque chose avec une boîte de dialogue de confirmation vous demandant si votre sûr:

-(void)deleteItem:(int)indexToDelete{
    UIActionSheet *confirm = [[UIActionSheet alloc] initWithTitle:@Delete Item? delegate:self cancelButtonTitle:@Cancel destructiveButtonTitle:@Delete otherButtonTitles:nil];
    [confirm showInView:self.view];
    [confirm release];
}

et la UIActionSheetDelegate dans la même classe:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (buttonIndex == 0){
        [[Settings sharedSettings] removeItemAtIndex:/*need index variable here*/];
        [drinksTable reloadData];
    }
}

Ce que je veux être en mesure de le faire est la déclarer en ligne, comme je l'ai fait dans l'exemple java en haut. Est-ce possible?

Créé 20/04/2009 à 01:18
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
17

Il n'y a aucun moyen de le faire en Objective-C actuellement. Apple a publié des travaux sur leurs efforts pour ajouter blocs (vraiment plus comme des fermetures de classes anonymes lambda que) à la langue. Vous probablement être en mesure de faire quelque chose de similaire au délégué anonyme avec ceux-ci.

Dans le même temps, la plupart des programmeurs Cocoa ajouter les méthodes de déléguer à une catégorie distincte de la classe des délégués. Cela aide à garder le code plus organisé. Dans le fichier .m pour la classe dans votre exemple, je ferais quelque chose comme ceci:

@interface MyClass (UIActionSheetDelegate)
- (void)actionSheet:(UIActionSheet*)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex;
@end

@implementation MyClass
//... normal stuff here
@end

@implementation MyClass (UIActionSheetDelegate)
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (buttonIndex == 0){
        [[Settings sharedSettings] removeItemAtIndex:/*need index variable here*/];
        [drinksTable reloadData];
    }
}
@end

méthode de Xcode de pop-up dans la fenêtre de l'éditeur séparera la déclaration de la catégorie et la mise en œuvre de la classe principale.

Créé 20/04/2009 à 17:09
source utilisateur

voix
4

Objective-C n'a pas de notion de classes anonymes comme de Java, donc vous ne pouvez pas créer une classe « en ligne » comme dans le code Java.

Créé 20/04/2009 à 01:22
source utilisateur

voix
2

Je cherchais quelque chose de différent quand je suis tombé sur cela , mais si vous effectuez une recherche pour UIAlertView + BLOCS , vous trouverez plusieurs résultats pour faire UIALERTVIEWs inline. C'est celui que je sers: ALERTVIEW w / blocs

Créé 17/06/2011 à 15:03
source utilisateur

voix
1

Je crois que les classes anonymes peuvent être mises en œuvre en Objective-C, mais il faudra beaucoup de NSProxymagie et la IMPfolie. C'est l' un de mes projets en cours.

Créé 01/12/2009 à 01:03
source utilisateur

voix
0

Que diriez-vous d'une classe qui implémente l'interface délégué. Lors de l'initialisation, il faudrait un bloc. Dans la définition de délégué appelle ce bloc.

Cela permet à plusieurs UIActionSheets d'exister simultanément sans avoir à comparer sur l'identité.

Créé 26/04/2012 à 22:08
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more