委托并从childViewController传递数据

时间:2016-01-25 00:55:26

标签: objective-c delegation childviewcontroller parentviewcontroller

我几天来一直在努力,并从S.O.获得了宝贵的帮助。我做了一个最简单的项目,以减少它成为拼写错误的可能性。 我的所有项目都是一个ViewController,它包含一个连接到childViewController的容器视图。 "父母" ViewController被设置为childViewController的委托。在孩子的viewDidLoad中,我传递的值只是一个字符串。该字符串应传递给父字符串并打印在控制台上。这是文件。

ViewController.h

#import <UIKit/UIKit.h>
#import "ChildViewController.h"

@interface ViewController : UIViewController <ChildViewControllerDelegate>

@end

ViewController.m

#import "ViewController.h"

@interface ViewController ()

@property NSString *myValueRetrieved;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

   ChildViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"ChildVC"];

    controller.delegate = self;

    NSLog(@"Here is my value: %@",self.myValueRetrieved);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void) passValue:(NSString *)theValue{

    self.myValueRetrieved = theValue;
}

@end

ChildViewController.h

#import <UIKit/UIKit.h>

@protocol ChildViewControllerDelegate;

@interface ChildViewController : UIViewController

@property (weak)id <ChildViewControllerDelegate> delegate;

@end

@protocol ChildViewControllerDelegate <NSObject>

- (void) passValue:(NSString*) theValue;

@end

ChildViewController.m

#import "ChildViewController.h"

@interface ChildViewController ()
@property NSArray *colors;
@end

@implementation ChildViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.delegate passValue:@"Hello"];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

@end

我是否认为启动应用程序时,控制台应记录以下消息:&#34;这是我的价值:你好&#34;。我在逻辑上没有获得授权方面做错了什么,或者它只是一个愚蠢的错字? TX

2 个答案:

答案 0 :(得分:0)

您假设在实例化视图控制器时加载视图。现在它是如何运作的。视图在需要时加载(比如添加到父视图中)。

但是你可以强制视图加载并使其工作。设置委托后立即在子视图控制器上调用-loadViewIfNeeded。这可能会让你得到你想要的东西:

controller.delegate = self;
[controller loadViewIfNeeded];
NSLog(@"Here is my value: %@",self.myValueRetrieved);

或者,如果您确实要在viewDidLoad中回拨代理,那么您需要将NSLog移至-passValue:方法,因为主视图控制器& #39; s viewDidLoad方法已经完成运行。

答案 1 :(得分:0)

为此,使ParentController成为ChildController的委托。这允许ChildController将消息发送回ParentController,使我们能够发回数据。

要使ParentController成为ChildController的委托,它必须符合我们必须指定的ChildController协议。这告诉ParentController它必须实现哪些方法。

在ChildController.h中,在#import下面,但在@interface上方指定协议。

@class ChildController;

@protocol ViewControllerBDelegate <NSObject>
- (void)addItemViewController:(ChildController *)controller didFinishEnteringItem:(NSString *)item;
@end

接下来仍然在ChildController.h中你需要设置一个委托属性并在ChildController.h中进行综合

@property (nonatomic, weak) id <ChildControllerDelegate> delegate;

在ChildController中,当我们弹出视图控制器时,我们在委托上调用一条消息。

NSString *itemToPassBack = @"Pass this value back to ParentController";
[self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack];

这就是ChildController。现在在ParentController.h中,告诉ParentViewController导入Child并遵守其协议。

import“ChildController.h”

@interface ParentController:UIViewController 在ParentController.m中,从我们的协议

中实现以下方法
- (void)addItemViewController:(ChildController *)controller didFinishEnteringItem:(NSString *)item
{
    NSLog(@"This was returned from ChildController %@",item);
}

我们需要做的最后一件事是在将ChildController推送到导航堆栈之前告诉ChildController ParentController是它的委托。

ChildController *ChildController = [[ChildController alloc] initWithNib:@"ChildController" bundle:nil];
ChildController.delegate = self
[[self navigationController] pushViewController:ChildController animated:YES];