Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 目标c遗传和设定者_Ios_Objective C_Inheritance_Synthesize - Fatal编程技术网

Ios 目标c遗传和设定者

Ios 目标c遗传和设定者,ios,objective-c,inheritance,synthesize,Ios,Objective C,Inheritance,Synthesize,目标C问题: 我有一个ViewController的超类和一个data controller的超类。数据控制器有权在更新后通知ViewController。这一切似乎都是可行的,但在输入一些日志之后,委托方法似乎每次都会被调用两次。我想每个子数据控制器实际上可能有两个实例。我一定是在某处举例说明什么地方出错了。有人能看出我做错了什么吗 我有一个数据密集型应用程序的单独屏幕。我已将其设置为UIViewController的一个超类,所有这些超类都继承自: DmsProgressBaseViewCo

目标C问题:

我有一个ViewController的超类和一个data controller的超类。数据控制器有权在更新后通知ViewController。这一切似乎都是可行的,但在输入一些日志之后,委托方法似乎每次都会被调用两次。我想每个子数据控制器实际上可能有两个实例。我一定是在某处举例说明什么地方出错了。有人能看出我做错了什么吗

我有一个数据密集型应用程序的单独屏幕。我已将其设置为UIViewController的一个超类,所有这些超类都继承自:

DmsProgressBaseViewController.h

@class DmsProgressDataController;

@interface DmsProgressBaseViewController : UIViewController

@property(readonly,assign,nonatomic)DmsProgressDataController *dataController;
//index, so we be identified in container
@property(assign,nonatomic)NSInteger index;

@end
@class AFHTTPRequestOperation;
@class DmsProgressDataController;

@protocol DmsProgressDataControllerDelegate

-(void)dataLoadedSuccessfully;

@end


@interface DmsProgressDataController : NSObject

@property(nonatomic,assign)id delegate;
@property(nonatomic, strong)NSString *resourceUrl;
-(void)loadDataFromRest;
-(void)loadDataFromRest:(NSString*)resourceUrl;
-(void)handleRestSuccess:(id)jsonResponse;
-(void)handleRestError:(NSError*)error forOperation:(AFHTTPRequestOperation*)operation;

//delegate method
-(void)notifyDataLoadedSuccessfully;

@end
@interface DmsProgressOverallDataController : DmsProgressDataController

@end
DmsProgressBaseViewController.m

@implementation DmsProgressBaseViewController

@synthesize dataController=_dataController;


- (void)viewDidLoad
{
    [super viewDidLoad];
}

-(DmsProgressDataController*)dataController
{
    if(!_dataController){
        _dataController=[[DmsProgressDataController alloc]init];
    }
    return _dataController;
}

.....

@end
@interface DmsProgressOverallViewController ()<DmsProgressDataControllerDelegate>

@end

@implementation DmsProgressOverallViewController
@synthesize dataController=_dataController;
- (void)viewDidLoad
{
    [super viewDidLoad];
[self.dataController loadDataFromRest:@"overall"];
    self.dataController.delegate=self;
}

-(DmsProgressDataController*)dataController
{
    if(!_dataController){
        _dataController=[[DmsProgressOverallDataController alloc]init];
    }
    return _dataController;
}
#pragma mark - datacontroller delegate method
-(void)dataLoadedSuccessfully
{
    NSLog(@"Overall data loaded successfully");
}

@end
@implementation DmsProgressOverallDataController


-(id)init
{
    if(self=[super init]){
        self.resourceUrl=@"progress/totals";
    }

    return self;
}

-(void)handleRestSuccess:(id)jsonResponse
{
    NSString *defaultClg=[jsonResponse objectForKey:@"defaultClg"];
    NSArray *clgs=[jsonResponse objectForKey:@"colleges"];
    for(NSString *clg in clgs){
        College *college =[College MR_createEntity];
        college.collegeName=clg;
        if([defaultClg isEqualToString:clg]){
            college.defaultClg=[NSNumber numberWithBool:YES];
        }
    }

    //DataController delegate method called here
    if(self.delegate!=nil){
        [self.delegate dataLoadedSuccessfully];
    }

}

@end
正如您所见,每个视图都有一个datacontroller,它通过rest服务加载数据并将其导入核心数据。它还继承自: dmsprrogressdatacontroller.h

@class DmsProgressDataController;

@interface DmsProgressBaseViewController : UIViewController

@property(readonly,assign,nonatomic)DmsProgressDataController *dataController;
//index, so we be identified in container
@property(assign,nonatomic)NSInteger index;

@end
@class AFHTTPRequestOperation;
@class DmsProgressDataController;

@protocol DmsProgressDataControllerDelegate

-(void)dataLoadedSuccessfully;

@end


@interface DmsProgressDataController : NSObject

@property(nonatomic,assign)id delegate;
@property(nonatomic, strong)NSString *resourceUrl;
-(void)loadDataFromRest;
-(void)loadDataFromRest:(NSString*)resourceUrl;
-(void)handleRestSuccess:(id)jsonResponse;
-(void)handleRestError:(NSError*)error forOperation:(AFHTTPRequestOperation*)operation;

//delegate method
-(void)notifyDataLoadedSuccessfully;

@end
@interface DmsProgressOverallDataController : DmsProgressDataController

@end
DmsProgressDataController.m @数据控制器的实现

- (id)init
{
    self = [super init];
    if (self) {

    }
    return self;
}

-(void)loadDataFromRest
{
    NSLog(@"loading %@",self.resourceUrl);
    if(self.resourceUrl!=nil){
        [self loadDataFromRest:self.resourceUrl];
    }
}
....

#pragma mark - delegate methods
-(void)notifyDataLoadedSuccessfully
{
    if(self.delegate!=nil){
        [self.delegate dataLoadedSuccessfully];
    }
}
@end
因此,这些是超级类

子类的一个示例是: DmsProgressOverallViewController.h @类DMS ProgressOverallDataController

@interface DmsProgressOverallViewController : DmsProgressBaseViewController

@property(readonly,strong,nonatomic)DmsProgressOverallDataController *dataController;

@end
DmsProgressOverallViewController.m

@implementation DmsProgressBaseViewController

@synthesize dataController=_dataController;


- (void)viewDidLoad
{
    [super viewDidLoad];
}

-(DmsProgressDataController*)dataController
{
    if(!_dataController){
        _dataController=[[DmsProgressDataController alloc]init];
    }
    return _dataController;
}

.....

@end
@interface DmsProgressOverallViewController ()<DmsProgressDataControllerDelegate>

@end

@implementation DmsProgressOverallViewController
@synthesize dataController=_dataController;
- (void)viewDidLoad
{
    [super viewDidLoad];
[self.dataController loadDataFromRest:@"overall"];
    self.dataController.delegate=self;
}

-(DmsProgressDataController*)dataController
{
    if(!_dataController){
        _dataController=[[DmsProgressOverallDataController alloc]init];
    }
    return _dataController;
}
#pragma mark - datacontroller delegate method
-(void)dataLoadedSuccessfully
{
    NSLog(@"Overall data loaded successfully");
}

@end
@implementation DmsProgressOverallDataController


-(id)init
{
    if(self=[super init]){
        self.resourceUrl=@"progress/totals";
    }

    return self;
}

-(void)handleRestSuccess:(id)jsonResponse
{
    NSString *defaultClg=[jsonResponse objectForKey:@"defaultClg"];
    NSArray *clgs=[jsonResponse objectForKey:@"colleges"];
    for(NSString *clg in clgs){
        College *college =[College MR_createEntity];
        college.collegeName=clg;
        if([defaultClg isEqualToString:clg]){
            college.defaultClg=[NSNumber numberWithBool:YES];
        }
    }

    //DataController delegate method called here
    if(self.delegate!=nil){
        [self.delegate dataLoadedSuccessfully];
    }

}

@end
DmsProgressOverallDataController.m

@implementation DmsProgressBaseViewController

@synthesize dataController=_dataController;


- (void)viewDidLoad
{
    [super viewDidLoad];
}

-(DmsProgressDataController*)dataController
{
    if(!_dataController){
        _dataController=[[DmsProgressDataController alloc]init];
    }
    return _dataController;
}

.....

@end
@interface DmsProgressOverallViewController ()<DmsProgressDataControllerDelegate>

@end

@implementation DmsProgressOverallViewController
@synthesize dataController=_dataController;
- (void)viewDidLoad
{
    [super viewDidLoad];
[self.dataController loadDataFromRest:@"overall"];
    self.dataController.delegate=self;
}

-(DmsProgressDataController*)dataController
{
    if(!_dataController){
        _dataController=[[DmsProgressOverallDataController alloc]init];
    }
    return _dataController;
}
#pragma mark - datacontroller delegate method
-(void)dataLoadedSuccessfully
{
    NSLog(@"Overall data loaded successfully");
}

@end
@implementation DmsProgressOverallDataController


-(id)init
{
    if(self=[super init]){
        self.resourceUrl=@"progress/totals";
    }

    return self;
}

-(void)handleRestSuccess:(id)jsonResponse
{
    NSString *defaultClg=[jsonResponse objectForKey:@"defaultClg"];
    NSArray *clgs=[jsonResponse objectForKey:@"colleges"];
    for(NSString *clg in clgs){
        College *college =[College MR_createEntity];
        college.collegeName=clg;
        if([defaultClg isEqualToString:clg]){
            college.defaultClg=[NSNumber numberWithBool:YES];
        }
    }

    //DataController delegate method called here
    if(self.delegate!=nil){
        [self.delegate dataLoadedSuccessfully];
    }

}

@end
我希望这能提供足够的信息。
再次感谢您的帮助

在SubViewController中有一个实例变量名和属性名,它们也存在于超类SuperViewController中。可以在超类和类中合成属性名。我怀疑正在发生的是,SubViewClass中的_dataController是从SuperViewController继承的_dataController。您没有提供足够的代码来查看dataController是如何使用的,但是如果您有不同的ivar和属性名称(a),那么读取起来就不会那么混乱,(b)它可能会解决双重调用问题。试试看

我想指出你把术语弄得很复杂
@interface SuperViewController:UIViewController
表示
SuperViewController
UIViewController
的子类
UIViewController
UIResponder
的子类。而
UIResponder
NSObject
的一个子类,它是基类。编辑:我现在看到您的
SuperViewController
名称与
SubViewController
类有关。您需要告诉我们有关该代理的更多信息。我们没有这方面的消息。这不是继承或合成问题。正如其他人之前所说,您的代码很难阅读,因为例如,您的SuperViewController实际上是UIViewController的子类。您使用的是我们不知道的SuperDataController。好的,很抱歉代码含糊不清。我还是个笨蛋。我编辑并添加了更详细的代码。实际上,我认为这是一个综合/继承问题,我只是不确定在objective c中如何正确地进行继承。