目标C - 如何实现自定义回调方法但强制执行特定参数?

Avi*_*ron 19 oop objective-c callback ios objective-c-blocks

在我的应用程序中,我有一个自定义的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...
}
Run Code Online (Sandbox Code Playgroud)

而且我讨厌这种编码风格...

相反,我真的想要一种允许ViewController给它自己的回调的机制.

我可以允许PickerCell接受" onRowSelectedSelector",但是如何确保这个选择器的格式符合我的要求?(参数数量最重要)

更好的是,我想给Picker单元格一个来执行选择,因为我知道可以使用特定参数定义块.此外,不需要传递"目标"对象.

那我该怎么做呢?

谢谢!

Bry*_*hen 35

这是如何使用块回调

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
Run Code Online (Sandbox Code Playgroud)

并在创建选择器单元后分配回调块

PickerCell *cell = // create a picker cell
cell.callback = ^(NSInteger row, NSInteger component) {
    // inside callback
};
Run Code Online (Sandbox Code Playgroud)