Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 通过viewcontroller将代理传递给viewcontroller_Objective C_Ios_Ios5_Uiapplicationdelegate_Segue - Fatal编程技术网

Objective c 通过viewcontroller将代理传递给viewcontroller

Objective c 通过viewcontroller将代理传递给viewcontroller,objective-c,ios,ios5,uiapplicationdelegate,segue,Objective C,Ios,Ios5,Uiapplicationdelegate,Segue,我的故事板中有三个viewController,每个都有三个viewController类。在我的主viewController中,我以“模态”类型segue打开导航viewController,这是一种多步骤形式,其中有两个视图。当用户在最后一个(第二个)视图中点击“Finish”时,模式被取消,用户返回主屏幕 我正在与代表们一起这样做。finish按钮的代码也在代理中,并放置在主viewController的实现文件中。为了实现这一点,我将委托从主视图传递到导航的第一个视图,然后在单击“下一

我的故事板中有三个viewController,每个都有三个viewController类。在我的主viewController中,我以“模态”类型segue打开导航viewController,这是一种多步骤形式,其中有两个视图。当用户在最后一个(第二个)视图中点击“Finish”时,模式被取消,用户返回主屏幕

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

将委托从main传递到navigation的第一页如下所示:

- (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的故事板工作不多,所以我对那里的最佳实践并不完全熟悉。