从子视图调用时,获取根视图在根视图对象上调用的方法

时间:2014-04-10 11:26:39

标签: objective-c

RootView有一个标签和一个更新此标签的方法。容器视图中还有许多视图。其中任何一个都应该能够更新此标签。他们通过调用此方法来实现此目的。我可以从这些子视图控制器调用它,但它不会更新标签。从根视图调用它会更新标签。我已经阅读了有关代表的内容,但我还没有成功添加代表。代表们,这是我应该这样做的吗?

这是来自subView。请纠正我如果我错了,但我认为它不起作用,因为它创建了一个新的rootView,而不是使用旧的rootView。

故事板图片在这里:http://i58.tinypic.com/2e17j1e.jpg

[super viewDidLoad];
self.rootView = [[RootViewController alloc]init];
[self.rootView displaymessage:@"Hello sent from child"];

2 个答案:

答案 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];