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