通过viewcontroller将委托传递给viewcontroller

时间:2012-02-24 10:08:58

标签: objective-c ios ios5 uiapplicationdelegate segue

我的故事板中有三个viewControllers,每个都有三个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 个答案:

答案 0 :(得分:1)

您如何在CreateCastStepTwoVC上声明委托属性?也, 您的代表是否符合您定义的协议?

委托属性的典型声明如下所示:

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

或者如果您没有使用协议(不推荐):

@property (nonatomic, __unsafe_unretained) id delegate;

编辑:

看过您的财产声明后,您需要根据以下问题将weak更改为__unsafe_unretainedRecommended way to declare delegate properties with ARC

答案 1 :(得分: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类似的功能。事实上,如果你查看它的声明文件,这就是实现选择器的方式。