我想在另一个控制器中创建一个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
我在这里做错了什么?任何帮助将受到高度赞赏。
答案 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进行一些研究。但希望这有助于您更好地理解选择器如何工作。