通过视图控制器将委托传递给视图控制器
Posted
技术标签:
【中文标题】通过视图控制器将委托传递给视图控制器【英文标题】: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;
【问题讨论】:
【参考方案1】:您是如何在CreateCastStepTwoVC
上声明委托属性的?还,
您的代表是否符合您定义的协议?
委托属性的典型声明如下所示:
@property (nonatomic, __unsafe_unretained) id<MyProtocol> delegate;
或者如果您不使用协议(不推荐):
@property (nonatomic, __unsafe_unretained) id delegate;
编辑:
查看您的属性声明后,您需要根据以下问题将 weak
更改为 __unsafe_unretained
:Recommended 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
类似的功能。实际上,如果您查看它的声明文件,这就是选择器的实现方式。
【讨论】:
以上是关于通过视图控制器将委托传递给视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
如何通过应用程序委托使用托管对象上下文实例化还原的视图控制器?