2012-03-28 12 views
19

Nella mia app ho una sottoclasse UITableViewCell personalizzata che fa apparire un selettore quando premuto. da ora in poi mi riferirò a questa classe come PickerCell. Sto usando diverse istanze di PickerCell nello stesso UITableView.Obiettivo C - Come implementare il metodo di callback personalizzato ma applicare un parametro specifico?

Non voglio che la cella risponda alla selezione di una riga nel selettore, perché non è un buon MVC. Invece voglio che il ViewController dia alla cella un callback che verrà chiamato alla selezione della riga.

Il modo più ovvio è creare un protocollo come PickerCellDelegate e il controller di visualizzazione passerà a ciascuna cella.

Il mio problema con questo approccio è che da quando ho diverse PickerCells, la mia implementazione del protocollo nel ViewController dovrà distinguere tra ogni cella:

-(void) pickerCell : (PickerCell *) sender 
     didSelectRow : (NSInteger) row 
     inComponent : (NSInteger) component 
{ 
    if (sender == X) 
    // Something 
    else if (sender == Y) 
    // Something else... 
    // etc... 
} 

E odio questo stile di codifica ...

Invece mi piacerebbe davvero un meccanismo che permetta al ViewController di dargli il proprio callback.

Posso consentire a PickerCell di accettare un "onRowSelectedSelector", ma come faccio a garantire che questo selettore sia nel formato che desidero? (Il numero dei parametri è il più importante)

Ancora meglio, vorrei dare alla cella Picker un blocco da eseguire alla selezione, perché so che i blocchi possono essere definiti con parametri specifici. Inoltre non è necessario passare un oggetto "bersaglio".

Quindi, come faccio a fare una cosa del genere?

Grazie!

risposta

33

questo è come utilizzare blocco callback

typedef void(^PickerCallback)(NSInteger row, NSInteger component); 

@interface PickerCell 

@property (nonatomic, copy) PickerCallback callback; 

@end 

@implementation PickerCell 

@synthesize callback; 

- (void)whatever { 
    // when you want to call the callback block 
    if (self.callback) { 
     self.callback(row, component); 
    } 
} 

@end 

e assegnare blocco richiamata dopo cella raccoglitrice creato

PickerCell *cell = // create a picker cell 
cell.callback = ^(NSInteger row, NSInteger component) { 
    // inside callback 
}; 
+0

Eccellente! esattamente quello che stavo cercando! –

Problemi correlati