Domanda

E 'possibile dichiarare implementazioni anonime di cose come delegati in Objective-C. Credo di avere il diritto terminologia, ma ecco un esempio di Java:

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

Così, ad esempio, per gestire una chiamata in UIActionSheet devo dichiarare un altro metodo nella stessa classe, che sembra un po 'sciocco se voglio passare i dati, perché avrei dovuto memorizzare i dati come una variabile globale. Ecco un esempio di cancellare qualcosa con una finestra di conferma che chiede se il vostro sicuro:

-(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];
}

e l'UIActionSheetDelegate nella stessa classe:

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

Quello che voglio essere in grado di fare è dichiararla in linea, proprio come ho fatto nell'esempio java in alto. È possibile?

È stato utile?

Soluzione

Non v'è alcun modo per fare questo in Objective-C al momento. Apple ha pubblicato un lavoro sulla loro sforzi per aggiungere blocchi (davvero più come chiusure lambda di classi anonime) al linguaggio. Si sarebbe probabilmente in grado di fare qualcosa di simile al delegato anonimo con quelli.

Nel frattempo, la maggior parte dei programmatori di cacao aggiungere i metodi delegato ad una categoria a parte sulla classe delegato. Ciò contribuisce a mantenere il codice più organizzato. Nel file .m per la classe nel tuo esempio, vorrei fare qualcosa di simile:

@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

di Xcode metodo pop-up nella finestra di editor separerà dichiarazione e implementazione della categoria dalla classe principale.

Altri suggerimenti

Objective-C non ha una nozione di classi anonime come Java di, quindi non si può creare una classe "in linea", come nel codice Java.

Ero alla ricerca di qualcosa di diverso quando mi sono imbattuto in questo, ma se fate una ricerca per UIAlertView + BLOCCHI troverete diversi risultati per fare UIALERTVIEWs linea. Questo è quello che ho usato: ALERTVIEW w / blocchi

Credo che le classi anonime possono essere implementate in Objective-C, ma ci vorrà un sacco di NSProxy magia e IMP follia. Questo è uno dei miei progetti in corso.

Come su una classe che implementa l'interfaccia delegato. All'inizializzazione ci vorrebbe un blocco. Nella definizione delegato chiama questo blocco.

Questo consente a più UIActionSheets di esistere contemporaneamente senza dover confrontare sull'identità.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top