2012-02-24 4 views
1

У меня есть три viewControllers в моей раскадровке и три класса viewController для каждого из них. Из моего основного viewController я открываю навигационный viewController в стиле модального типа, который представляет собой многоэтапную форму и имеет два представления. Когда пользователь нажимает «Готово» на последнем (что является вторым) представлением, модаль отклоняется и пользователь возвращается на главный экран.Передача делегата в viewcontroller через viewcontroller

Я делаю это с делегатами. и код для кнопки завершения также находится в делегате и помещается в основной файл реализации viewController. Для этого я передал делегат с основного вида на первый вид навигации, а затем с первого взгляда на нажатие «next» я передал делегат ко второму (последнему) представлению (которое имеет кнопку завершения).

прохождение делегата от основных на первую страницу навигации является так:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"CreateCast"]) 
    { 
     UINavigationController *navigationController = segue.destinationViewController; 
     CreateCastStepOneVC *createCastStepOneVC = [[navigationController viewControllers] objectAtIndex:0]; 
     createCastStepOneVC.delegate = self; 
    } 
} 

прохождения делегата от первого навигационного к второй точке зрения, как это:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"ToCastStepTwo"]) 
    { 
     CreateCastStepTwoVC *createCastStepTwoVC = 
     segue.destinationViewController; 
     createCastStepTwoVC.delegate = delegate; 
    } 
} 

вещей сделаны и делегат выполняет свою работу по мере необходимости. Но предупреждение всплывает, который вызывает беспокойство:

Передача «_weak идентификатор» для параметра несовместимого типа «ид»

декларации собственности в первой точки зрения навигации, как это:

@property (nonatomic, weak) id <CreateCastStepOneVCDelegate> delegate; 

декларация на имущество второй вид навигации, как это:

@property (nonatomic, weak) id <CreateCastStepTwoVCDelegate> delegate; 

ответ

1

Как вы заявили о собственности делегата на CreateCastStepTwoVC? Кроме того, являются вашими делегатами, соответствующими протоколу, который вы определили?

Типичная декларация для свойства делегата будет выглядеть примерно так:

@property (nonatomic, __unsafe_unretained) id<MyProtocol> delegate; 

или, если вы не используете протокол (не рекомендуется):

@property (nonatomic, __unsafe_unretained) id delegate; 

EDIT:

Увидев ваши объявления о недвижимости, вам необходимо изменить weak на __unsafe_unretained по этому вопросу: Recommended way to declare delegate properties with ARC

+0

Этот способ передачи делегата через контроллер просмотра даже рекомендуется? или есть ли другой лучший способ? – Firdous

+0

Я не вижу причин не использовать делегатов для этого. Этот сиад, я не очень много работал с раскадрой segues, поэтому не совсем хорошо знаком с лучшими практиками. –

0

Вы можете подкласса UINavigationController и добавить пользовательский протокол в свой подкласс. При таком подходе вы сможете позвонить своему делегату со всех своих контроллеров просмотра внутри вашего навигационного контроллера. Например, это так, как я использовал для этого:

@class CustomNavigationController; 

@protocol CustomNavControllerDelegate <NSObject> 

- (void)editImageController:(CustomNavControllerDelegate *)controller 
didFinishPickingMediaWithInfo:(NSDictionary *)info; 
- (void)editImageControllerDidCancel:(CustomNavControllerDelegate *)controller; 

@end 

@interface CustomNavigationController : UINavigationController 

@property (nonatomic, weak) id <UINavigationControllerDelegate, CustomNavControllerDelegate> delegate; 

@end 

В этом примере я реализовал подобную функциональность к UIImagePickerController. Фактически, это способ, которым занимается сборщик, если вы посмотрите на его файл декларации.

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