RootView
有一个标签和一个更新此标签的方法。容器视图中还有许多视图。其中任何一个都应该能够更新此标签。他们通过调用此方法来实现此目的。我可以从这些子视图控制器调用它,但它不会更新标签。从根视图调用它会更新标签。我已经阅读了有关代表的内容,但我还没有成功添加代表。代表们,这是我应该这样做的吗?
这是来自subView。请纠正我如果我错了,但我认为它不起作用,因为它创建了一个新的rootView,而不是使用旧的rootView。
故事板图片在这里:http://i58.tinypic.com/2e17j1e.jpg
[super viewDidLoad];
self.rootView = [[RootViewController alloc]init];
[self.rootView displaymessage:@"Hello sent from child"];
答案 0 :(得分:0)
你在做什么是错的。调用self.rootView = [[RootViewController alloc]init];
实际上会创建RootViewController
的新实例。 Fortunaltely,UIVIewController
拥有一个名为presentingViewController
的属性,它代表了呈现孩子的viewController。
self.rootView = self.presentingViewController;
[self.rootView displaymessage:@"Hello sent from child"];
或者简单地说,
[(RootViewController*)self.presentingViewController displaymessage:@"Hello sent from child"];
以下是关于presentingViewController
财产的Apple文档的link。
修改强>
考虑到故事板的复杂性,我建议您使用NSNotificationCenter
来更改标签。方法如下:
在RootViewController的viewDidLoad中,粘贴此代码:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(displaymessageFromNotification:) name:@"rootDisplayMessage" object:nil];
然后将以下方法添加到RootViewController的.m文件中:
-(void)displaymessageFromNotification:(NSNotification*)notification
{
NSDictionary *data = [notification userInfo];
NSString *message = [data objectForKey:@"message"];
[self displaymessage:message];
}
然后,从代码中要在RootViewController中显示消息的任何位置,使用以下行:
NSDictionary *dicMessage = [NSDictionary dictionaryWithObject:@"Your message here." forKey:@"message"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"rootDisplayMessage" object:nil userInfo:dicMessage];
答案 1 :(得分:0)
尝试这样的代码:
// rootView添加子控制器位置
ChildControllers *childVc = [[ChildControllers alloc] init];
childVc.rootView = theRootViewAddChildVc;
// child controller.h
@property (nonatomic, weak) RootViewController * rootView;
// child controller.m更新标签位置:
[self.rootView updateLabel];