【问题标题】:using Delegate and its selector使用委托及其选择器
【发布时间】:2012-11-18 09:37:17
【问题描述】:

我有一个特定的场景,我正在尝试完成更通用的方法,即使用委托并根据正在设置的选择器调用选择器。

例如下面是代码:

@protocol HttpRequestDelegate
@optional


- (void)testDrive:(NSData*)dataembedd;

@end


- (id)init {

    self = [super init]; 

    if (self) {

        //Initialize it here.
        self.HttpRequestdelegate = self;
    }

    return self;
}

HttpRequest *apiCaller = [[HttpRequest alloc] init];
        NSLog(@"%@",apiCaller.HttpRequestdelegate);
        [WLCC_ApiCaller executeAsync:apiCaller.HttpRequestdelegate :@selector(testDrive:) :[NSURL URLWithString:updateUrl] :wlcc_Get];

但是在 executeAsync 调用中,我试图调用选择器,它是试驾,例如:

[delegate performSelector:@selector(selector) withObject:responseData];

但它给了我一个未知选择器的错误,但是当我注意到委托的引用在初始化时它是相同的。

我正在尝试在不同的类中使用委托执行选择器,除了我需要在这里做的其他事情吗?

谢谢。

【问题讨论】:

  • 您尝试了吗[delegate performSelector:selector withObject:responseData];
  • @EmptyStack 我试过了,我得到 -[HttpRequest testDrive:]: unrecognized selector sent to instance 0x7c26520'error.
  • 你如何声明HttpRequestdelegateself.HttpRequestdelegate 是什么?
  • 我认为 init 方法在 HttpRequest 类中。您正在设置self.HttpRequestdelegate = self;。这是错误的。我认为您正在尝试完成一些不同的事情。我不确定。请详细解释一下您要做什么。
  • @kforkarim 对。任何冒号之前都没有任何内容(第一个冒号除外)。就目前而言,方法名称是executeAsync::::。这不是很自我记录。

标签: iphone objective-c ios ipad cocoa


【解决方案1】:

像这样定义你的协议:

@protocol HttpRequestDelegate <NSObject>

有一个NSObject 类和一个NSObject 协议。您的所有协议都应符合NSObject 协议。这为您提供了 respondsToSelector: 等方法。

【讨论】:

  • @maddy,我正在尝试这个: if ([delegate respondsToSelector:selector]) { [delegate performSelector:@selector(selector) withObject:responseData]; } 在你的建议和它绕过 if 语句之后。如果我删除这样的 if 语句,它会因相同的无法识别的错误而崩溃
  • 什么是selector?您没有显示足够的代码来确定您需要哪些参数。无论哪种方式,您传递给respondsToSelector:performSelector: 的内容都必须相同。在您的评论中,它们是不同的。
  • 是的,你是对的,它应该是 performSelector:selector 而不是 @selector 顺便说一句,这是我进行的修改并让委托工作.. HttpRequest *apiCaller = [[HttpRequest alloc] init]; [apiCaller setHttpRequestdelegate:[NSObjectAppDelegate 类]];
【解决方案2】:

我想应该是;看起来你正在其他地方实现函数并尝试从没有继承委托的地方调用,并且可能会错过那个特定的函数实现。

通常使用委托模式,因此我们可以根据需要实现函数(或者可以说提供回调),但该类必须符合该委托。您检查了吗?

请详细说明您的实施,因为我认为幕后有很多信息,例如:WLCC_ApiCaller executeAsync 等。

【讨论】:

  • Mohit,在我的情况下,因为没有特定类设置委托,因此我将类类型设置为 setDelegate:[Class name];这对我有用。我在某处的一个示例中看到了相同的内容。
猜你喜欢
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多