In my app I have a custom UITableViewCell subclass that pops up a picker when pressed. from now on I'll refer to this class as PickerCell.
I'm using several of instances of PickerCell in the same UITableView
.
I don't want the cell to respond to the selection of a row in the picker, because it's not a good MVC. Instead I want the ViewController to give the cell a callback that will be called upon selection of row.
The most obvious way is to create a protocol like PickerCellDelegate
and the view controller will pass himself to each cell.
My problem with this approach is that since I have several PickerCells, my implementation of the protocol in the ViewController will have to distinguish between each cell:
-(void) pickerCell : (PickerCell *) sender
didSelectRow : (NSInteger) row
inComponent : (NSInteger) component
{
if (sender == X)
// Something
else if (sender == Y)
// Something else...
// etc...
}
And I hate this coding style...
Instead I would really like a mechanism that allow the ViewController to give it's own callback.
I can allow the PickerCell to accept a "onRowSelectedSelector
", but then how do I ensure that this selector is in the format that I want? (Number of parameters is the most important)
Even better, I would like to give the Picker cell a block to execute on selection, because I know blocks can be defined with specific parameters. In addition there is no need to pass a "target" object.
So how do I do such a thing?
Thanks!
this is how to use block 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
and assign callback block after picker cell created
PickerCell *cell = // create a picker cell
cell.callback = ^(NSInteger row, NSInteger component) {
// inside callback
};
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With