iOS:发送到实例的无法识别的选择器

标签 ios selector

我有一个类,我从提供者类请求信息,其中完成作业(异步 httpRequest block )后需要调用请求者类中的方法 [- (void) updateCountries]。如果我没记错的话,这段代码在 iOS 7 中有效,但现在在 iOS 8 中无效。

你能帮我理解为什么吗?

请求者类中的方法:

- (void) viewWillAppear:(BOOL)animated {
    //get countries to pickerView
    webAPI = [[WebAPI alloc] init];
    [webAPI retrieveCountries:self];
}

- (void) updateCountries {
    //update countries content for pickerView
    locationDAO = [[LocationDAO alloc] init];
    countriesArray = [locationDAO getCountries];

    [pickerView reloadAllComponents];
}

提供程序类中方法中发生错误的行:

SEL updateCountries = sel_registerName("updateCountries:");
[requester performSelectorOnMainThread:updateCountries withObject:nil waitUntilDone:YES];

如果你需要检查提供者类中的整个方法,这里是:

- (void) retrieveCountries:(id)requester {

//    NSLog(@"engine report: firing retrieveCountries http get");

    NSString *urlAsString = kRetrieveCountriesListAPI;
    NSURL *url = [NSURL URLWithString:urlAsString];



    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];
    [urlRequest setTimeoutInterval:30.0f];
    [urlRequest setHTTPMethod:@"GET"];
    [urlRequest setValue:@"application/json" forHTTPHeaderField:@"Content-type"];


    [NSURLConnection sendAsynchronousRequest:urlRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

        if ([data length] >0 && error == nil){
            NSString *response = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"engine report: retrieveCountries server response: %@", response);

            NSArray *level0 = [[NSArray alloc] initWithObjects:[NSJSONSerialization JSONObjectWithData:[[NSData alloc] initWithData:data] options:kNilOptions error:&error], nil];

            NSArray *level1 = [level0 objectAtIndex:0];

            LocationDAO *locationDAO = [[LocationDAO alloc] init];
            [locationDAO deleteAllFromCountries];

            for (int i = 0; i < [level1 count]; i++) {

                CountryVO *countryVO = [[CountryVO alloc] init];

                countryVO.myID = [[[level1 objectAtIndex:i] objectForKey:@"id"] integerValue];
                countryVO.name = [[level1 objectAtIndex:i] objectForKey:@"country_name"];


                [locationDAO saveCountryToDatabase:countryVO];

            }

            SEL updateCountries = sel_registerName("updateCountries:");

            [requester performSelectorOnMainThread:updateCountries withObject:nil waitUntilDone:YES];

            dispatch_async(dispatch_get_main_queue(), ^(void){

            });


        } else if ([data length] == 0 && error == nil){
            NSLog(@"Nothing was downloaded.");

        } else if (error != nil) {
            NSLog(@"Error happened = %@", error);
        } }];

}

非常感谢

最佳答案

从选择器规范中删除 ::

SEL updateCountries = sel_registerName("updateCountries");

您的方法 updateCountries 不接受任何参数。因此,在创建选择器 时,您应该只编写 updateCountries(而不是 updateCountries:,这表明此方法需要一个参数)。

您的应用程序崩溃的原因是,当您尝试执行此选择器时,您的应用程序的内部正在寻找一个名为 updateCountries 的方法,该方法在 requester 上需要一个争论。此方法不存在,这就是应用程序崩溃的原因。

关于iOS:发送到实例的无法识别的选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30681332/

相关文章:

ios - 核心图形中三角函数定义的梯度

angular - 用另一个替换 Angular 组件

objective-c - 如何删除 AddressBookGroup 条目?

ios - 将星期几放在图形、图表上

ios - 添加到 UITextField 的 CALayer 不会出现在 xib View 上

javascript - 在纯 javaScript 中选择以给定字符串开头的每个类

javascript - 在 jquery 选择器中使用变量

jms - Stomp 选择器条件

jquery - 使用 JQuery 不区分大小写地比较文本输入值

ios - 如何在 swift 3 的其他功能中使用服务器响应和数据