【问题标题】:how to create a method with a selector parameter如何使用选择器参数创建方法
【发布时间】:2013-03-11 17:02:09
【问题描述】:

您好,我正在尝试制作一个以选择器为参数的 Objective-C 方法。但我不断收到“发送到实例的无法识别的选择器”错误消息。我正在执行以下操作:

这是带有选择器参数的方法:

-(void)createURL: (SEL) selector{ 
dispatch_sync(kBgQueue,^{
NSData* data = [NSData dataWithContentsOfURL: wcfURL];
    [self performSelectorOnMainThread:@selector(selector)
                           withObject:data waitUntilDone:YES];


});
}

这是我想成为选择器的方法:

-(void)fetchedUserType:(NSData *)responseData{

NSError* error;
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData
                                                     options:kNilOptions
                                                       error:&error];

userType = [json objectForKey:@"getUserTypeResult"];
}

这就是我调用我的方法的地方:

- (void)viewDidLoad
{
[super viewDidLoad];
NSString *url = [NSString stringWithFormat:@"http://10.211.55.3:1234/Service1.svc/getUserType/%@", userEmail];
wcfURL = [[NSURL alloc]initWithString:url];
SEL sel = NSSelectorFromString(@"fetchedUserType:");
[self createURL:sel];

}

【问题讨论】:

    标签: objective-c parameter-passing selector


    【解决方案1】:

    编辑 1:

    您的错误在这里:

     [self performSelectorOnMainThread:@selector(selector)
     ----------------------------------^^^^^^^^^^^^^^^^^^^
    

    selector 已经是一个选择器,你又把它放入@selector()。

    应该是

     [self performSelectorOnMainThread:selector withObject:data waitUntilDone:YES];
    

    编辑 0:

    您的代码是正确的。只有在当前类中找不到您的 SEL 方法时,您才会收到错误。

    在下面的代码中,如果我将方法名称 sum 更改为 add 这将引发相同的错误。

    -(void)sum{
        NSLog(@"sum");
    }
    
    -(void) createURL: (SEL) selector{
        [self performSelector:selector];
    }
    
    - (IBAction)total:(id)sender {
        SEL sel = NSSelectorFromString(@"sum");
        [self createURL:sel];
    }
    

    此外,您还需要满足方法签名。如果你的方法需要一个参数,你需要发送一个。

    -(void)sum:(id)integer{
        NSLog(@"sum:%ld",[integer integerValue]);
    }
    
    -(void) createURL: (SEL) selector{
        //NSData* data = [NSData dataWithContentsOfURL: nil];
        //[self performSelectorOnMainThread:@selector(selector) withObject:data waitUntilDone:YES];
    
        [self performSelector:selector withObject:@(12)];
    }
    
    - (IBAction)total:(id)sender {
        NSInteger total=0;
    
        for (id element in self.arrayController.arrangedObjects) {
            total += [element firstNumber]*[element secondNumber];
        }
        [self.label setStringValue:[NSString stringWithFormat:@"%ld",total]];
    
    
        SEL sel = NSSelectorFromString(@"sum:");
        [self createURL:sel];
    
    }
    

    【讨论】:

    • 但它们都在同一个类中,我收到了错误消息
    • 您的选择器名称是nameOFmyMethodSelector:,所以您确定您也传递了参数吗?
    • 换句话说,在末尾包含一个冒号意味着您也在传递一个参数。 nameOFmyMethodSelector:nameOFmyMethodSelector 是有区别的
    • 我在 createURL 中声明的 NSData 是 nameOFmyMethodSelector 的参数:所以我相信一切都可以
    • 哦,我明白了,非常感谢,我已经尝试修复它好几个小时了!!
    猜你喜欢
    • 2017-07-22
    • 2010-09-22
    • 2017-11-11
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 2011-04-22
    • 2011-01-14
    • 1970-01-01
    相关资源
    最近更新 更多