ios - 我无法在 iOS 中从另一个文件执行选择器

标签 ios objective-c api callback selector

我正在尝试在 iOS 中实现我自己的 Api,但我在回调方面遇到了一个问题。

我已经使用选择器实现了回调,但是当给定的函数位于另一个文件/类中时,应用程序崩溃。

这是错误:

2013-09-18 21:32:16.278 Vuqio[6498:19703] -[VuqioApi postCurrenProgramRequestDidEnd]: unrecognized selector sent to instance 0xa5a2150
2013-09-18 21:32:16.278 Vuqio[6498:19703] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[VuqioApi postCurrenProgramRequestDidEnd]: unrecognized selector sent to instance 0xa5a2150'

这是我的代码:

调用:(文件 Controller .m)

...
[self softCheckIn:@"922337065874264868506e30fda-1c2a-40a5-944e-1a2a13e95e95" inProgram:p.idProgram callback:@selector(postCurrenProgramRequestDidEnd)];
...
-(void)postCurrenProgramRequestDidEnd
{
    NSLog(@"Soft check-in");
}

- (void)softCheckIn:(NSString *)userId inProgram:(NSString *)program callback:(SEL)callback
{
    // Hacemos un soft checkin
    VuqioApi *api = [[VuqioApi alloc] init];
    NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
                                                userId, @"userId",
                                                program, @"programId",
                                                nil];
    [api postCurrentProgram:data withSuccess:callback andFailure:@selector(aaa)];
}

方法:(文件Api.m)

- (void)postCurrentProgram:(NSDictionary *)data withSuccess:(SEL)successCallback
{
    NSLog(@"Performing selector: %@", NSStringFromSelector(successCallback));

    [self postCurrentProgram:data withSuccess:successCallback andFailure:@selector(defaultFailureCallback)];
}
- (void) postCurrentProgram:(NSDictionary *)data withSuccess:(SEL)successCallback andFailure:(SEL)failureCallback {
    [self placePostRequest:@"api/programcurrent" withData:data withHandler:^(NSURLResponse *urlResponse, NSData *rawData, NSError *error) {

        NSLog(@"Performing selector: %@", NSStringFromSelector(successCallback));
        NSLog(@"Performing selector: %@", NSStringFromSelector(failureCallback));

        NSString *string = [[NSString alloc] initWithData:rawData encoding:NSUTF8StringEncoding];
        //NSDictionary *json = [NSJSONSerialization JSONObjectWithData:rawData options:0 error:nil];

        if ( ![string isEqual: @"ok"])
        {
            [self performSelector:failureCallback withObject:self];
        } else {
            NSLog(@"OK");
            [self performSelector:successCallback];
        }
    }];
}

- (void) defaultFailureCallback {
    NSLog(@"Failure");
}

最佳答案

选择器是在特定类型的实例上执行的。您需要传递将向其发送选择器消息的对象以及选择器。

在上面的例子中,Controller.m aaa 中有一个选择器,它可能是 Controller 实例上的有效方法,但在 Api.m 文件中,您尝试在 Api 实例上调用方法 aaa,这会导致崩溃,因为该方法对该类无效。

关于ios - 我无法在 iOS 中从另一个文件执行选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18880775/

相关文章:

java - 使用 HTTP API 在推特上上传视频

android - 使用 retrofit 2 下载 POST 方法的 PDF 响应

ios - 如何在 UITableViewCell 上使用自定义初始化程序?

ios - 无法从字符串获取 JSON

javascript - 从 iPhone 原生应用访问 Google API

objective-c - 如何模拟 UITextField 上的 isEditing getter?

ios - 我如何在 GameplayKit/SpriteKit 中以有效的方式对实体和组件进行建模

ios - 我的应用程序应该支持什么版本的 iOS?

ios - 当我在数组中创建一些 block 时,为什么索引 0 不应该被复制?

jquery - 更改 Google 自定义搜索上的输入背景颜色