2012-03-28 4 views
19

私のアプリでは、押されたときにピッカーをポップアップするカスタムUITableViewCellサブクラスがあります。今度はこのクラスをPickerCell.として参照してください。 私は同じUITableViewでPickerCellのインスタンスをいくつか使用しています。目的C - カスタムコールバックメソッドを実装する方法はありますが、特定のパラメータを適用するにはどうすればいいですか?

良いMVCではないため、ピッカーの行選択にセルが反応しないようにしたいと思います。 代わりにViewControllerに、行の選択時に呼び出されるコールバックをセルに付ける必要があります。

最も明白な方法はPickerCellDelegateのようなプロトコルを作成することです。そして、ビューコントローラは自分自身を各セルに渡します。このアプローチの

私の問題は、私はいくつかのPickerCellsを持っているので、のViewControllerにおけるプロトコルの私の実装では、各セルを区別しなければならないことである。

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

そして私は、このコーディングスタイルを嫌い...

代わりに、私は実際にViewControllerが独自のコールバックを与えることができるメカニズムが好きです。

PickerCellに「onRowSelectedSelector」を受け入れることができますが、このセレクタがどのような形式であることを確認するにはどうすればよいですか? (パラメータの数が最も重要です)

ブロックが特定のパラメータで定義できることがわかっているので、ピッカーセルにブロックブロックを実行してもらいます。さらに、「ターゲット」オブジェクトを渡す必要はありません。

どうすればこのようなことができますか?

ありがとう!

答えて

33

これは、ブロックコールバック

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 

を使用すると、ピッカーセルが

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

を作成した後にコールバックブロックを割り当てる方法です!まさに私が探していたもの! –

関連する問題