以下内容将通过respondsToSelector
测试,但SIGABRT
会通过实际调用[viewController selector]
或[viewController action:selector]
。堆栈跟踪声明'NSInvalidArgumentException,原因: - [MyViewController选择器]:无法识别的选择器'。
[viewController @selector(selector)]
将导致编译错误(错误:在'selector'之前预期':'。)
当选择器是硬编码时,一切运行良好。
如何通过选择器向对象发送消息?
-(void) notifyViewControllers:(NSString*) message
{
if(!message) return;
SEL selector = NSSelectorFromString(message);
if(!selector) return;
NSArray* viewControllers = [self.tabBarController viewControllers];
if(!viewControllers) return;
for (UIViewController* viewController in viewControllers)
{
if(!viewController) continue;
if ([viewController respondsToSelector:selector]) {
// [viewController selector];
[viewController action:selector];
}
}
}
答案 0 :(得分:10)
[self performSelector:@selector(notifyViewControllers:) withObject: message];
答案 1 :(得分:4)
尝试
[viewController performSelector:selector];
还要检查performSelector'family'中的其他方法NSObject - 使用它们,您可以轻松地使用延迟和/或后台线程调用选择器。
答案 2 :(得分:2)
在不能使用performSelector的情况下知道如何执行此操作可能很有用,可能因为选择器字符串必须在协议方法中使用:
为了允许选择器支持参数,应该指定如下:
NSString *stringForSelector = @"doSomethingAwesome:"; // notice the colon
假设我们要处理轻击手势
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:NSSelectorFromString(stringForSelector)];
UIGestureRecognizer类允许在动作回调中使用识别器本身:
- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer;
所以要在Tap上做一些很棒的事情,我们可以写:
- (void)doSomethingAwesome:(UITapGestureRecognizer *)tapGesture
{
// gesture handling with UIGestureRecognizer availability
}