将方法作为参数传递

Pass method as argument

提问人:html_programmer 提问时间:10/14/2011 最后编辑:html_programmer 更新时间:1/16/2014 访问量:487

问:

我可以将方法作为参数传递吗? 在下面的示例中,我没有成功传递 targetOpenView 方法:

-(void) targetTimeView:(id)sender {    
[self TimeViewWithtimeInterval:.6 selector:targetOpenView]; //targetOpenView does NOT work
}

-(void) timeViewWithtimeInterval:(float)interval selector:openViewMethod{
[NSTimer scheduledTimerWithTimeInterval:interval target:self selector:@selector(openViewMethod) userInfo:nil repeats:NO];   
}

有什么建议,我该怎么做?谢谢!

objective-c 参数传递

评论

2赞 bbum 10/14/2011
方法应始终以小写字母开头;即 .timeViewWithTimeInterval:selector:
0赞 html_programmer 10/14/2011
哦,好吧,我会考虑的。

答:

6赞 sidyll 10/14/2011 #1

您需要编译器指令来从方法名称中提取选择,就像创建计时器时所做的那样:@selector

[self TimeViewWithtimeInterval:.6 selector:@selector(targetOpenView)];

并将参数定义为类型:SEL

-(void) TimeViewWithtimeInterval:(float)interval selector:(SEL)openViewMethod
{    
 ...
}

然后,在将参数传递给 NSTimer 方法时,您可以省略 因为类型已经是选择器:@selector

[NSTimer scheduledTimerWithTimeInterval:interval target:self
                               selector:@selector(openViewMethod) /* here */
                               userInfo:nil repeats:NO];   

[NSTimer scheduledTimerWithTimeInterval:interval target:self
                               selector:openViewMethod /* pass it directly */
                               userInfo:nil repeats:NO];

评论

0赞 html_programmer 10/14/2011
嘿,谢谢,但是我在 [self TimeViewWithtimeInterval:.6 selector:targetOpenView]...
0赞 bbum 10/14/2011
用您尝试过的内容更新您的问题。这个答案是正确的。
0赞 html_programmer 10/14/2011
我在方法“TimeViewWithTimeInterval”中添加了“(SEL)”,但是我有问题的是方法“targetTimeView”。当我输入“targetOpenView”时,我立即收到错误...他不会让我把方法作为论据......
0赞 sidyll 10/14/2011
不用担心:-)我只是用我错过的东西更新了答案。
1赞 html_programmer 10/14/2011
废话,我要去给自己买一副眼镜!你必须有千里眼才能知道这一点!再次感谢!