2013-03-11 72 views
2

嗨我想做一个有选择器作为参数的客观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"]; 
} 

,这就是我“M叫我的方法:

- (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]; 

}

回答

3

编辑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]; 

} 
+0

但它毕竟是在同一个班,我收到错误消息 – megara 2013-03-11 17:19:51

+1

您选择的名字是'nameOFmyMethodSelector:'中以rü一定要传递参数呢? – 2013-03-11 17:21:25

+0

换句话说,在末尾包含一个冒号意味着你也传递了一个参数。 'nameOFmyMethodSelector:'和'nameOFmyMethodSelector'之间有区别 – MikeS 2013-03-11 17:25:34

相关问题