0

我有一个 iPhone 应用程序,其中有一个ClassB名为:

-(void)login:(NSString *)url withDelegate:(id)delegate { }

此方法是从 调用的ClassA。我传入委托参数,以便ClassA在此方法完成时传递回调:

if(delegate && [delegate respondsToSelector:@selector(parseLogin:)]) {
   [delegate parseLogin:loginInfoDictionary];
}

但是,我收到一条警告,指出:-Instance method: parseLogin: not found

这并不奇怪,因为我从未将参数委托转换为任何特定的类。但是,为了使此方法尽可能抽象,我想将委托的数据类型保留为id.

这可能吗????

我正在运行 iOS 5.1(如果重要的话)。如果可能的话,我想摆脱警告。

非常感谢!布雷特

4

3 回答 3

4

处理此问题的常用方法是创建一个协议并让 ClassA 实现该协议。

@protocol ProtocolName
- (void) parseLogin:(NSDictionary*)dictionary;
@end

然后在 ClassA 中实现协议

@interface ClassA : NSObject<ProtocolName>

然后将您的方法更改为:

-(void)login:(NSString *)url withDelegate:(id<ProtocolName>)delegate { }

这将摆脱警告并且仍然是可扩展的。

于 2012-04-23T20:29:38.677 回答
1

如果不同的类想成为委托,请在 ClassB.h 中声明一个 @protocol 并让调用类采用该协议@interface ClassA : UIViewController <ClassBDelegate>

稍微不那么正式和更快:如果您知道委托将始终是 ClassA 的实例?ClassA 作为委托类型而不是 id。

更快的是,为了避免编译器警告,就是让你的代码保持原样,除了像这样调用:

if(delegate && [delegate respondsToSelector:@selector(parseLogin:)]) {
   [delegate performSelector:@selector(parseLogin:) withObject:loginInfoDictionary afterDelay:0.0];
}
于 2012-04-23T20:31:55.073 回答
1

你不能使用协议吗?像这样的协议:

@protocol LoginDelegate <NSObject>

@optional
- (void) parseLogin: (NSDictionary*) dict;

@end

因此,在您的 classA 中,您将使用id<LoginDelegate>.

于 2012-04-23T20:32:13.350 回答