我几天来一直在努力,并从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
答案 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并遵守其协议。
@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];