Подтвердить что ты не робот

Цель 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 для выполнения при выборе, потому что я знаю, что блоки могут быть определены с определенными параметрами. Кроме того, нет необходимости передавать "целевой" объект.

Итак, как мне это сделать?

Спасибо!

4b9b3361

Ответ 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
};