Передача делегата в viewcontroller через viewcontroller - PullRequest
1 голос
/ 24 февраля 2012

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

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

передача делегата с главной страницы на первую страницу навигации выглядит следующим образом:

- (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 id' параметру несовместимый тип 'id'

Объявление свойства в первом виде навигации выглядит следующим образом:

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

Объявление свойства второго вида навигации выглядит так:

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

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Как вы объявили свойство делегата на CreateCastStepTwoVC? Также, Ваши делегаты соответствуют протоколу, который вы определили?

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

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

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

@property (nonatomic, __unsafe_unretained) id delegate;

EDIT:

После просмотра объявлений свойств вам нужно изменить weak на __unsafe_unretained в соответствии с этим вопросом: Рекомендуемый способ объявления свойств делегата с помощью ARC

0 голосов
/ 27 ноября 2013

Вы можете создать подкласс 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. На самом деле, это способ реализации средства выбора, если вы посмотрите на его файл объявления.

...