2012-03-28 3 views
19

In meiner App habe ich eine benutzerdefinierte UITableViewCell-Unterklasse, die einen Picker öffnet, wenn sie gedrückt wird. Von nun an werde ich diese Klasse als PickerCell. bezeichnen Ich verwende mehrere Instanzen von PickerCell in der gleichen UITableView.Ziel C - Wie benutzerdefinierte Callback-Methode zu implementieren, aber bestimmte Parameter erzwingen?

Ich möchte nicht, dass die Zelle auf die Auswahl einer Zeile im Picker reagiert, weil es keine gute MVC ist. Stattdessen möchte ich, dass der ViewController der Zelle einen Rückruf gibt, der bei der Auswahl der Zeile aufgerufen wird.

Der offensichtlichste Weg ist, ein Protokoll wie PickerCellDelegate zu erstellen und der View-Controller wird sich selbst an jede Zelle übergeben.

Mein Problem mit diesem Ansatz ist, dass da ich mehrere PickerCells habe, meine Implementierung des Protokolls in dem Viewcontroller wird zwischen jeder Zelle zu unterscheiden:

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

Und Ich hasse diese Art der Programmierung ...

Stattdessen würde ich wirklich einen Mechanismus mögen, der dem ViewController erlaubt, seinen eigenen Rückruf zu geben.

Ich kann zulassen, dass die PickerCell eine "onRowSelectedSelector" akzeptiert, aber wie stelle ich dann sicher, dass dieser Selektor in dem Format ist, das ich möchte? (Anzahl der Parameter ist am wichtigsten)

Noch besser, ich würde gerne die Picker-Zelle eine Block auf Auswahl ausführen, weil ich weiß Blöcke mit bestimmten Parametern definiert werden können. Außerdem muss kein "Zielobjekt" übergeben werden.

Also, wie mache ich so etwas?

Danke!

Antwort

33

dies ist, wie Block Rückruf

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 

und ordnen Rückruf Block nach Picker Zelle

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

Excellent erstellt nutzen zu können! genau das was ich gesucht habe! –