如何在iOS中将另一个对象的函数作为选择器?
问题描述:
我已阅读selector as parameter in IOS的帖子。但是,我想扩大这个问题。如何在iOS中将另一个对象的函数作为选择器?
就我而言,我创建一个Objective-C(不斯威夫特)主/从应用程序,并希望创建类型的UIViewController DetailController对象,具有以下初始化函数
在DetailViewController.h
@interfact DetailViewController : UIViewController
- (id)initWithNibName:(NSString *)nibName withSaveSelector:(SEL)saveSelector
@end
...在DetailViewController.m
- (id)initWithNibName:(NSString *)nibName withSaveSelector:(SEL)saveSelector
{
self = [super initWithNibName:nibName bundle:nil];
if (self) {
UIBarButtonItem *done = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemDone
target:self
action:saveSelector];
[[self navigationItem] setRightBarButtonItem:done animated:YES];
}
return self;
}
现在,我只想继续再使用上面的代码来创建不同DetailViewController s,并且想要传递一个saveSelector函数,当用户按下“完成”按钮时该函数将被调用。
现在我有另一个视图控制器
@interface AnotherViewController : UIViewController
- (void)saveSelector:(id)sender;
@end
...,然后在另一个对象(即,NOT在AnotherViewController.m代码),我使用上述视图控制器,像这样.. 。
AnotherViewController *avc = [[AnotherViewController alloc] init];
DetailViewController *dvc = [[DetailViewController alloc] initWithNibName:@"AnotherViewController" withSaveSelector:@selector(???)];
我应该把什么?所以我可以将AnotherViewController :: saveSelector()函数传递给DetailViewController?
我希望这是有道理的。
答
更改方法:
- (id)initWithNibName:(NSString *)nibName withSaveSelector:(SEL)saveSelector forTarget:(id)target
,并调用它是这样的:
DetailViewController *dvc = [[DetailViewController alloc] initWithNibName:@"AnotherViewController" withSaveSelector:@selector(saveSelector:) forTarget:avc];
在DetailViewController.m
- (id)initWithNibName:(NSString *)nibName withSaveSelector:(SEL)saveSelector forTarget:(id)target
{
self = [super initWithNibName:nibName bundle:nil];
if (self) {
UIBarButtonItem *done = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemDone
target:target
action:saveSelector];
[[self navigationItem] setRightBarButtonItem:done animated:YES];
}
return self;
}