【问题标题】:Passing delegate to a viewcontroller through a viewcontroller通过视图控制器将委托传递给视图控制器
【发布时间】:2012-02-24 10:08:57
【问题描述】:

我的 storyboard 中有三个 viewController,每个都有三个 viewController 类。从我的主视图控制器中,我以“模态”类型的 segue 打开一个导航视图控制器,这是一个多步骤表单,其中有两个视图。当用户在最后一个(即第二个)视图上点击“完成”时,模式将被关闭,用户返回主屏幕。

我正在与代表一起做这件事。完成按钮的代码也在委托中,并放置在主视图控制器的实现文件中。为了实现这一点,我将委托从主视图传递到导航的第一个视图,然后从第一个视图单击“下一步”,我将委托传递到第二个(最后一个)视图(具有完成按钮)。

委托从主页面传递到导航的第一页是这样的:

- (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;
    }
}

delegate 从导航的第一个视图传递到第二个视图是这样的:

- (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;

【问题讨论】:

    标签: objective-c ios ios5 uiapplicationdelegate segue


    【解决方案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

    【讨论】:

    • 是否推荐这种通过视图控制器传递委托的方式?还是有其他更好的方法?
    • 我认为没有理由不使用委托来执行此操作。那个 siad,我对 segues 的故事板工作不多,所以对那里的最佳实践并不完全熟悉。
    【解决方案2】:

    您可以继承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 类似的功能。实际上,如果您查看它的声明文件,这就是选择器的实现方式。

    【讨论】:

      猜你喜欢
      • 2013-08-27
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      • 2019-01-06
      相关资源
      最近更新 更多