我是iPhone应用程序开发的新手,但到目前为止我似乎已经进行了一些管理(随时随地学习)..然而,我遇到了一个我无法弄清楚的问题。这是场景:
我有一个名为CoreAPI的扩展类,里面有我的网络功能。我在CoreAPI中有一个名为“Login”的函数,它向服务器发出请求,得到0或1响应并返回true或false。我让它与同步请求完美配合,但现在我需要将所有内容都异步。
所以,下面是我正在尝试做的...这不符合“类型ID的对象没有方法loginCallback”的错误
loginViewController.m
- (void) login {
CoreAPI APIObject = [[CoreAPI alloc] init];
[APIObject login:self];
}
- (void) loginCallback {
NSLog(@"It called back.");
}
CoreAPI.m
- (void)login:(id)sender {
[sender loginCallback];
}
谢谢,如果我错过了帮助我的任何细节,请告诉我。
答案 0 :(得分:1)
我看到了几个问题。首先,我猜你没有向CoreAPI.m提供loginCallback
函数的可见性。您应该能够将任何消息发送到id
类型,只要它是针对已知类型定义的。
但是,我建议在这种情况下使用完成块。这可能是这样的:
(在CoreAPI.h中)
- (void)login:(void (^)(void))completed;
(在CoreAPI.m中)
- (void)login:(void (^)(void))completed {
// Login code
if (completed) completed();
}
调用它看起来像:
CoreAPI APIObject = [[CoreAPI alloc] init];
[APIObject login:^{
NSLog(@"It called back.");
}];
他们有非常愚蠢的语法,但是块对于这种事情非常好。希望这有帮助!如果我没有清楚地解释一下,请告诉我。
答案 1 :(得分:0)
这应该可以帮到你:
首先,在CoreApi.m
中导入loginViewController标头#import "loginViewController.h"
然后,将登录方法更改为:
- (void)login:(id)sender {
[(loginViewController*)sender loginCallback];
}
或者这个:
- (void)login:(loginViewController*)sender {
[sender loginCallback];
}
说明:请注意您的登录方法是通过参数id
类型的对象接收的。在目标C中,id
类型表示对未知类的任何Objective-C的引用。因此,在您的登录方法中,编译器不知道发件人是您的loginViewController类的实例,因此它不会识别loginViewController的方法。
有关此信息,请阅读:Objective-C: difference between id and void *
请注意,我只专注于删除您的实际错误。您必须做更多的事情才能完成代码以便异步运行。
为了执行更好的回调,请查找代表或块(如oltman的回答)。