如何在iOS中将另一个对象的函数作为选择器?

如何在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; 
}