Objective c 通过viewcontroller将代理传递给viewcontroller
我的故事板中有三个viewController,每个都有三个viewController类。在我的主viewController中,我以“模态”类型segue打开导航viewController,这是一种多步骤形式,其中有两个视图。当用户在最后一个(第二个)视图中点击“Finish”时,模式被取消,用户返回主屏幕 我正在与代表们一起这样做。finish按钮的代码也在代理中,并放置在主viewController的实现文件中。为了实现这一点,我将委托从主视图传递到导航的第一个视图,然后在单击“下一步”时从第一个视图传递到第二个(最后一个)视图(具有“完成”按钮) 将委托从main传递到navigation的第一页如下所示:Objective c 通过viewcontroller将代理传递给viewcontroller,objective-c,ios,ios5,uiapplicationdelegate,segue,Objective C,Ios,Ios5,Uiapplicationdelegate,Segue,我的故事板中有三个viewController,每个都有三个viewController类。在我的主viewController中,我以“模态”类型segue打开导航viewController,这是一种多步骤形式,其中有两个视图。当用户在最后一个(第二个)视图中点击“Finish”时,模式被取消,用户返回主屏幕 我正在与代表们一起这样做。finish按钮的代码也在代理中,并放置在主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;
}
}
@property (nonatomic, weak) id <CreateCastStepOneVCDelegate> delegate;
@property (nonatomic, weak) id <CreateCastStepTwoVCDelegate> delegate;
@property (nonatomic, __unsafe_unretained) id<MyProtocol> delegate;
代理从导航的第一个视图传递到第二个视图如下:
- (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;
}
}
@property (nonatomic, weak) id <CreateCastStepOneVCDelegate> delegate;
@property (nonatomic, weak) id <CreateCastStepTwoVCDelegate> delegate;
@property (nonatomic, __unsafe_unretained) id<MyProtocol> delegate;
事情做得很好,代表正在按要求完成其工作。但一个令人担忧的警告突然出现:
正在将“\u弱id”传递给的参数
不兼容的类型“id”
第一个导航视图中的属性声明如下所示:
- (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;
}
}
@property (nonatomic, weak) id <CreateCastStepOneVCDelegate> delegate;
@property (nonatomic, weak) id <CreateCastStepTwoVCDelegate> delegate;
@property (nonatomic, __unsafe_unretained) id<MyProtocol> delegate;
@属性(非原子,弱)id委托;
属性声明是第二个导航视图,如下所示:
- (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;
}
}
@property (nonatomic, weak) id <CreateCastStepOneVCDelegate> delegate;
@property (nonatomic, weak) id <CreateCastStepTwoVCDelegate> delegate;
@property (nonatomic, __unsafe_unretained) id<MyProtocol> delegate;
@属性(非原子,弱)id委托;
您是如何在CreateCastStepTwoVC
上声明委托属性的?也,
您的代表是否符合您定义的协议
委托属性的典型声明如下所示:
- (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;
}
}
@property (nonatomic, weak) id <CreateCastStepOneVCDelegate> delegate;
@property (nonatomic, weak) id <CreateCastStepTwoVCDelegate> delegate;
@property (nonatomic, __unsafe_unretained) id<MyProtocol> delegate;
编辑:
看到属性声明后,您需要根据以下问题将
weak
更改为\u unsafe\u unrepaired
,您是如何在CreateCastStepTwoVC
上声明委托属性的?也,
您的代表是否符合您定义的协议
委托属性的典型声明如下所示:
- (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;
}
}
@property (nonatomic, weak) id <CreateCastStepOneVCDelegate> delegate;
@property (nonatomic, weak) id <CreateCastStepTwoVCDelegate> delegate;
@property (nonatomic, __unsafe_unretained) id<MyProtocol> delegate;
编辑:
看到属性声明后,您需要根据以下问题将
weak
更改为\u unsafe\u unrepaired
,您可以子类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
@class CustomNavigationController;
@协议CustomNavControllerDelegate
-(无效)editImageController:(CustomNavControllerDelegate*)控制器
didFinishPickingMediaWithInfo:(NSDictionary*)信息;
-(void)editImageControllerDidCancel:(CustomNavControllerDelegate*)控制器;
@结束
@接口CustomNavigationController:UINavigationController
@属性(非原子,弱)id委托;
@结束
在本例中,我实现了与
UIImagePickerController
类似的功能。事实上,如果您查看选择器的声明文件,这就是它的实现方式。您可以子类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
@class CustomNavigationController;
@协议CustomNavControllerDelegate
-(无效)editImageController:(CustomNavControllerDelegate*)控制器
didFinishPickingMediaWithInfo:(NSDictionary*)信息;
-(void)editImageControllerDidCancel:(CustomNavControllerDelegate*)控制器;
@结束
@接口CustomNavigationController:UINavigationController
@属性(非原子,弱)id委托;
@结束
在本例中,我实现了与
UIImagePickerController
类似的功能。事实上,如果查看选择器的声明文件,这就是它的实现方式。这是通过视图控制器传递委托的推荐方式吗?或者还有其他更好的方法吗?我认为没有理由不使用代理来完成这项工作。顺便说一句,我对segues的故事板没有太多的了解,所以我对那里的最佳实践并不完全熟悉。这种通过视图控制器传递代理的方法是推荐的吗?或者还有其他更好的方法吗?我认为没有理由不使用代理来完成这项工作。那就是说,我对segues的故事板工作不多,所以我对那里的最佳实践并不完全熟悉。