Цель C - Как реализовать собственный метод обратного вызова, но принудительно использовать определенный параметр?
В моем приложении у меня есть пользовательский подкласс UITableViewCell, который появляется при выборе. отныне я буду ссылаться на этот класс как PickerCell.
Я использую несколько экземпляров PickerCell в том же UITableView
.
Я не хочу, чтобы ячейка отвечала на выбор строки в сборщике, потому что это не хороший 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
", но как я могу обеспечить, чтобы этот селектор был в том формате, который я хочу? (Количество параметров является самым важным)
Еще лучше, я хотел бы дать ячейке Picker block для выполнения при выборе, потому что я знаю, что блоки могут быть определены с определенными параметрами. Кроме того, нет необходимости передавать "целевой" объект.
Итак, как мне это сделать?
Спасибо!
Ответы
Ответ 1
вот как использовать обратный вызов блока
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
};