使用选择器和NSSelectorFromString将消息发送到对象

时间:2011-06-30 08:02:47

标签: ios iphone objective-c selector

以下内容将通过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];
        }
    }
}

3 个答案:

答案 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
}