цель C вопрос:цель C наследование и сеттер
У меня есть суперкласс в ViewController и суперкласс контроллера данных. Контроллер данных имеет делегацию, чтобы сообщить ViewController, когда он обновлен. Кажется, все работает, но после ввода некоторых журналов кажется, что метод делегата вызывается дважды каждый раз. Я думаю, что у меня могло бы быть два экземпляра каждого SubDataController. Я должен что-то создавать что-то не так. Может ли кто-нибудь увидеть, что я делаю неправильно?
У меня есть отдельные экраны приложения с интенсивным использованием данных. Я его настроить таким образом, что есть суперкласс 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
DmsProgressBaseViewController.m
@implementation DmsProgressBaseViewController
@synthesize dataController=_dataController;
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(DmsProgressDataController*)dataController
{
if(!_dataController){
_dataController=[[DmsProgressDataController alloc]init];
}
return _dataController;
}
.....
@end
Как вы можете видеть каждый вид имеет datacontroller, который загружает данные через службу отдыха и импортирует их в основные данные. Он также унаследовал от: DmsProgressDataController.h
@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
DmsProgressDataController.m @implementation DmsProgressDataController
- (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 @class DmsProgressOverallDataController;
@interface DmsProgressOverallViewController : DmsProgressBaseViewController
@property(readonly,strong,nonatomic)DmsProgressOverallDataController *dataController;
@end
DmsProgressOverallViewController.m
@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
с datacontroller:
DmsProgressOverallDataController.h
@interface DmsProgressOverallDataController : DmsProgressDataController
@end
DmsProgressOverallDataController.m
@implementation DmsProgressOverallDataController
-(id)init
{
if(self=[super init]){
[email protected]"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
Надеюсь, это обеспечит достаточную информацию. Еще раз спасибо за вашу помощь!
Я бы указал, что вы извратили терминологию. '@interface SuperViewController: UIViewController' означает, что' SuperViewController' является подклассом 'UIViewController'. 'UIViewController' является подклассом' UIResponder'. И 'UIResponder' является подклассом' NSObject', который является базовым классом.** EDIT: ** Теперь я вижу, что ваше имя «SuperViewController» относится к классу «SubViewController». – bshirley
Вы должны сообщить нам больше об этом делетете. У нас нет информации об этом. Это не проблема наследования или синтеза. – bshirley
Как и раньше, ваш код трудно читать, так как, например, ваш SuperViewController на самом деле является подклассом UIViewController. И вы используете SuperDataController, которого мы не знаем. –