2013-08-01 6 views
0

цель 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 

Надеюсь, это обеспечит достаточную информацию. Еще раз спасибо за вашу помощь!

+0

Я бы указал, что вы извратили терминологию. '@interface SuperViewController: UIViewController' означает, что' SuperViewController' является подклассом 'UIViewController'. 'UIViewController' является подклассом' UIResponder'. И 'UIResponder' является подклассом' NSObject', который является базовым классом.** EDIT: ** Теперь я вижу, что ваше имя «SuperViewController» относится к классу «SubViewController». – bshirley

+0

Вы должны сообщить нам больше об этом делетете. У нас нет информации об этом. Это не проблема наследования или синтеза. – bshirley

+0

Как и раньше, ваш код трудно читать, так как, например, ваш SuperViewController на самом деле является подклассом UIViewController. И вы используете SuperDataController, которого мы не знаем. –

ответ

0

У вас есть имя переменной переменной и имя свойства в SubViewController, которые также присутствуют в суперклассе SuperViewController. Вы синтезируете имя свойства как в суперклассе, так и в классе. Я подозреваю, что происходит то, что _dataController в SubViewClass является унаследованным _dataController от SuperViewController. Вы не даете достаточно кода, чтобы узнать, как используется dataController, но если бы у вас были разные имена ivar и свойств (a), это было бы менее запутанным для чтения, и (b) он мог бы устранить проблему двойного вызова. Попробуй и посмотри!

Смежные вопросы