在另一个类中执行选择器

时间:2015-07-05 01:57:12

标签: ios objective-c selector

我想在另一个控制器中创建一个UITableViewController,并从该控制器传递一个方法。我已经读过这可以通过使用@selector来实现。现在我尝试了以下内容:

TimeController.m

- (void)choseTime{
    SelectOptionController *selectController = [[SelectOptionController alloc] initWithArray:[Time SQPFetchAll] andSelector:@selector(timeSelected)];
    [self.navigationController pushViewController:selectController animated:true];
}

- (void) timeSelected{
    NSLog(@"Time selected!");
}

SelectOptionController.h

@interface SelectOptionController : UITableViewController

@property (nonatomic, strong) NSMutableArray *dataset;
@property (nonatomic) SEL selectedMethod;

-(id)initWithArray: (NSMutableArray *) myArray andSelector: (SEL) selectedMethod;

SelectOptionController.m

- (id)initWithArray: (NSMutableArray *) myArray andSelector: (SEL) selectedMethod{
    self = [super initWithStyle:UITableViewStyleGrouped];
    if(self) {
        self.dataset = myArray;
        self.selectedMethod = selectedMethod;
    }
    return self;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    [self performSelector:self.selectedMethod];
    [self.navigationController popViewControllerAnimated:true];
}

但是,当选择一个单元格时,会抛出以下异常:

-[SelectOptionController timeSelected]: unrecognized selector sent to instance 0x1450f140

我在这里做错了什么?任何帮助将受到高度赞赏。

1 个答案:

答案 0 :(得分:3)

您正在timeSelected上调用self实际上是SelectOptionController,但TimeController类中存在timeSelected方法。

假设您不想将timeSelected移动到SelectOptionController,您需要将对TimeController的引用传递给新的SelectOptionController并在其上调用选择器。选择器只是对方法的引用,而不是方法本身。您可能也希望将其存储为弱引用。

E.g。

@interface SelectOptionController : UITableViewController

@property (nonatomic, strong) NSMutableArray *dataset;
@property (nonatomic) SEL selectedMethod;
@property (nonatomic, weak) TimeController *timeController;

- (id)initWithArray: (NSMutableArray *) myArray andSelector: (SEL) selectedMethod timeController:(TimeController*)timeController {
    self = [super initWithStyle:UITableViewStyleGrouped];
    if(self) {
        self.dataset = myArray;
        self.selectedMethod = selectedMethod;
        self.timeController = timeController;
    }
    return self;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    [self.timeController performSelector:self.selectedMethod];
    [self.navigationController popViewControllerAnimated:true];
}

所有这些都说明了,上面的代码将会运行,但这不是一个特别好的模式。我建议您调查Prototypes and Delegates以实现此行为,或者如果您想要传递方法本身,请对Blocks进行一些研究。但希望这有助于您更好地理解选择器如何工作。