在iOS中使用委托时出现了一种奇怪的情况。 委托方法将其控件发送到不同的类而不是调用类实现相同的委托方法。
示例:
我有一个调用Web服务的仪表板(一个不同的类实现了所有Web服务调用)。在仪表板中,全局Web服务类对象与委托自身一起存在。当我们调用Web服务时,控件将进入此类。那很好。
现在我正在使用另一个从仪表板或其他视图控制器推送的类,它也调用同一个Web服务。它全局拥有自己的Web服务类对象,并将委托设置为self。 当我通过Web服务调用控制转到仪表板的委托而不是这个类,当我从此类调用Web服务时,虽然已经从此类调用并且委托设置为self。
这种情况出现在很多地方,其中push child也实现了它的前一个类也实现了相同的委托方法,因此代之以被称为push类的方法被称为上一个类。
以下是解释上述示例的主要代码:
WebServiceCaller.h
类处理所有Web服务调用者
#import <Foundation/Foundation.h>
#import "WebserviceEnum.h"
@protocol WebServiceCallerDelegate;
@interface WebServiceCaller : NSObject
{
__unsafe_unretained id <WebServiceCallerDelegate> delegate;
NSOperationQueue * operationQueue;
}
@property(nonatomic, assign) id <WebServiceCallerDelegate> delegate;
-(void)cancelWebserviceCall;
-(void)cancelAllCalls;
#pragma mark - Class Methods
-(void)getListOfAnalyticQuestionsOfUserID:(NSString*)userid;
@end
#pragma mark - Protocol Methods
@protocol WebServiceCallerDelegate <NSObject>
@optional
-(void)getListOfAnalyticQuestionsCompletesSuccessfully:(BOOL)success WithList:(NSMutableArray*)arrQuestions WithMessage:(NSString*)message;
@end
WebServiceCaller.m
在将webservice调用结果发送到调用类之后。
-(void) getListOfAnalyticQuestionsOfUserID:(NSString*)userid{
NSString *url = [NSString stringWithFormat:@"%@?user_id=%@",[self getURLWithBase:BaseURL relativeURL:@"wt_question.php"],userid];
//webservice call goes here and after completion calls below method
}
-(void)getListOfAnalyticQuestionsCalledSuccessfully:(BOOL)success WithData:(id)Data WithMessage:(NSString*)errorMessage{
NSDictionary *dictResult = (NSDictionary*)Data;
NSMutableArray *arrAnalytics = nil;
NSString *message = errorMessage;
if (success) {
arrAnalytics = [dictResult objectForKey:@"items"];
message = SuccessMessage;
}
else{
if (message.length==0) {
message = NETWORKERRORMESSAGE;
}
}
if(self.delegate!=nil && [(id)[self delegate] respondsToSelector:@selector(getListOfAnalyticQuestionsCompletesSuccessfully:WithList:WithMessage:)])
{
[(id)[self delegate] getListOfAnalyticQuestionsCompletesSuccessfully:success WithList:arrAnalytics WithMessage:message];
}
}
来自调用类的代码片段假设类B,同样的实现已经在A类中完成,B也被推送,所以每个东西都工作正常而不是发送控制到B类控件被发送到A类(webServiceCaller对象是以与B类相同的方式在A类中创建并调用相同的Web服务,这只是其他Web服务的一个例子。它由push和它的前一个类实现。)
#import "WebServiceCaller.h"
#define numberOfRecordsPerPage 15
@interface AnalyisViewController ()<UITableViewDataSource,UITableViewDelegate,WebServiceCallerDelegate>
{
NSInteger currentIndex;
NSDictionary *dictQuesList;
NSInteger totalPages;
NSMutableArray *arrQuestionList;
WebServiceCaller *webServiceCaller;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
webServiceCaller = [[WebServiceCaller alloc]init];
webServiceCaller.delegate = self;
[self showQuestions];
}
-(void)showQuestions{
[ProgressHUD show:@"Loading..." Interaction:NO];
[webServiceCaller cancelAllCalls];
[webServiceCaller getListOfAnalyticQuestionsOfUserID:userid];
}
#pragma mark - Webservice delegate
-(void) getListOfAnalyticQuestionsCompletesSuccessfully:(BOOL)success WithList:(NSMutableArray*)arrQuestions WithMessage:(NSString*)message{
//Handles my stuff
}
@end
对这种奇怪的情况有所了解。