2013-06-06 3 views
0

Быстрый вопрос,призывают делегатов в viewdidload

я сделал пользовательский делегат

PupilView.h

@protocol DismissPupilViewPopoverDelegate 
- (int) getPupilViewReason; 
@end 


@interface PupilView : UIViewController{ 
    id<DismissPupilViewPopoverDelegate> delegate; 
} 

@property (nonatomic, assign) id<DismissPupilViewPopoverDelegate> delegate; 

Это называется в PupilView.m нравится следующим

[[self delegate] getPupilViewReason]; 

in in my maincontroller.h

#import "PupilView.h" 

@interface MainScreen : UIViewController<DismissPupilViewPopoverDelegate> 

maincontroller.m

-(int) getPupilViewReason 
{ 
    return 100; 
} 

Если я поставил [[собственного делегата] getPupilViewReason]; в любой функции в pupilview.m он отлично работает, возвращает 100, я вижу его с точкой останова и т. д.

Если я поставил его в viewdidload, он не загружает, возвращает 0, dosnt hit breakpoints и т. д. Любая помощь в отношении Зачем.

спасибо

+0

Возможно, вы, возможно, узнаете, пытаясь назвать это. (если ваш делегат установлен, то я не понимаю, почему это не сработает) – wattson12

+0

, если я вызываю его в другой другой функции, похоже, что это работает, в viewdidload это dosn't, мне было интересно, возможно ли это сделать или если мне нужно сделать что-то другое – user2336727

+0

Вы должны следовать соглашениям об именах Objective-C: 'getPupilViewReason'. – allprog

ответ

1

сделать собственный метод инициализации для контроллера вида, в котором вы передаете делегат, чтобы вы могли установить делегат в методе init до вызова viewdidload.

@interface 
- initWithDelegate:(id)aDelegate nibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
//... 
@end 

@implementation 
    - initWithDelegate:aDelegate nibName:nibNameOrNil bundle:nibBundleOrNil{ 
     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
      if (self) { 
      _delegate = aDelegate; 
      ///rest of init implementation 
      } 
    } 

    - (void)viewDidLoad{ 
      [super viewDidLoad]; 

      [self.delegate getPupilViewReason]; 

    } 
//... 
@end 
+0

Это хорошая привычка, но не работает, если ViewController инициализирован из Storyboard. Если есть такой делегат и используется раскадровка, лучше всего настроить делегат в обратном вызове 'readyForSegue'. Если нет раскадровки, тогда ваш ответ будет подходящим. – allprog

0

Вперед и позвоните. Если делегат настроен правильно, он должен работать. Вы имеете в виду, когда вы выполняете передачу пользовательского интерфейса segue?

0

Да, вы можете вызвать делегата в функции viewDidLoad.

Пусть ваше имя делегата (владельца запроса) является «делегат», то вы можете назвать как -

 - (void)viewDidLoad 
      { 
       [super viewDidLoad]; 

       [<OBJ>.delegate GetPupilViewReason]; 

      } 

OBJ - это экземпляр класса, есть назначить делегата.