Цель C - Как реализовать пользовательский метод обратного вызова, но применить определенный параметр? - PullRequest
19 голосов
/ 28 марта 2012

В моем приложении есть пользовательский подкласс UITableViewCell, который при нажатии выдает всплывающее окно.отныне я буду ссылаться на этот класс как PickerCell. Я использую несколько экземпляров PickerCell в одном и том же UITableView.

Я не хочу, чтобы ячейка реагировала на выборстрока в сборщике, потому что это не хороший MVC.Вместо этого я хочу, чтобы ViewController дал ячейке обратный вызов, который будет вызываться при выборе строки.

Самый очевидный способ - создать протокол, подобный PickerCellDelegate, и контроллер представления передаст себя каждой ячейке.

Моя проблема с этим подходом состоит в том, что, поскольку у меня есть несколько PickerCell, моя реализация протокола в 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", но тогда как мне убедиться, что этот селектор в нужном мне формате?(Количество параметров является наиболее важным)

Еще лучше, я хотел бы дать ячейке Пикера блок для выполнения при выборе, потому что я знаю, что блоки могут быть определены с конкретными параметрами.Кроме того, нет необходимости передавать «целевой» объект.

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

Спасибо!

1 Ответ

34 голосов
/ 28 марта 2012

это как использовать обратный вызов блока

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
};
...