-1

我已经为此苦苦挣扎了几天,并在途中得到了宝贵的帮助,所以我做了一个最简单的项目,以减少它成为错字的可能性。我的所有项目都是一个 ViewController,它包含一个连接到 childViewController 的容器视图。“父” ViewController 被设置为 childViewController 的委托。在孩子的 viewDidLoad 中,我传递的值只是一个字符串。此字符串应传递给父级并打印在控制台上。这是文件。

视图控制器.h

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

@interface ViewController : UIViewController <ChildViewControllerDelegate>

@end

视图控制器.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

我是否认为当应用程序启动时,控制台应该记录以下消息:“这是我的值:你好”。我在逻辑上没有获得授权方面做错了什么,还是只是某个地方的愚蠢错字?发送

4

2 回答 2

0

您假设在实例化视图控制器时加载了视图。这就是它现在的工作方式。视图在需要时被加载(比如添加到父视图)。

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

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

或者,如果您确实想在 中回调委托viewDidLoad,那么您需要将 移动NSLog到该-passValue:方法,因为主视图控制器的viewDidLoad方法已经完成运行。

于 2016-01-25T01:14:32.050 回答
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 并遵守其协议。

导入“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];
于 2016-01-25T05:09:30.653 回答