调用父UIViewControllers函数

时间:2011-11-23 14:59:41

标签: iphone cocoa-touch uiviewcontroller uikit

好的,我遇到了问题,但却无法找到我做错的事。

我有UIVievController的视图和一些功能和内容。一种是打开(从动作表中的按钮)另一个UIVeiwController。看起来像这样:

PersonalSettings *personalSettings;
-(IBAction) displaySettingsMenu:(id)sender
{
    personalSettings = [[PersonalSettings alloc] 
                        initWithNibName:@"PersonalSettings" 
                        bundle:nil];
    [self.view addSubview:personalSettings.view];
    [SettingsSheet dismissWithClickedButtonIndex:0 animated:YES];
}

这就像一个魅力,我可以在这个视图中进行som更新。 当我关闭此视图时,所有设置都会正确更新并且视图消失,但我想要做的是重新加载父ViewController(查看?),以便我可以看到我所做的新设置。我在父母身上有一个无效功能,但我该怎么称呼呢? 当孩子ViewController中点击了保存按钮时,我会删除视图:

[self.view removeFromSuperview];

我在这里要做的是从父视图的子视图调用更新函数。

我找到了一些代码,但是除了“superclass”而不是“superview”,因为superview没有出现在列表中。看起来像这样:

[self.view removeFromSuperview];

MainViewController *Parent = (MainViewController *)self.superclass;
[Parent updateView];

我可以做一些“神奇”的事情来说“重新加载父视图”吗?

我希望我能让这个问题变得可以理解。 :)

编辑:

非常感谢你gyus,我现在离我很近了。 我不是100%肯定这个委托事情是如何运作的(但是)但我接近解决方案。实际上,我意识到甚至不必运行方法,只需更新标签。

从孩子那里,我写了这个:

MainViewController* Parent = [[MainViewController alloc] init];
Parent.delegate = self;
Parent.TheLabel.text = @"foo";

...但这不起作用 - 即使它确实找到了标签和所有东西。如果我从孩子那里尝试这个:

NSLog(@"Parent label: %@", Parent.TheLabel.text);

记录“父标签:( null)”。

但是,但是,我现在可以从孩子那里获得更新功能并运行。问题是这个函数从其他标签中获取值(在父视图中),这就是它崩溃的地方 - 当我从子项运行函数时,它们都说null。即使他们没有。有什么想法吗?

4 个答案:

答案 0 :(得分:1)

如果您熟悉委托模型,则让您的父视图成为委托,并从子节点以这种方式传递信息。你可以在Apple网站上找到一些关于它的好文档。

基本上你给孩子的'构造函数'添加'委托'字段,即:

child = [[ViewController alloc] initWithDelegate:this withNibName:@"myNib"];

然后,在子类中,当您收到信息时,您可以访问代理中的字段/方法。

- (void) volumeDidChange:(int)volume
{
    delegate.volume = volume
}

或类似的东西。祝你好运!

答案 1 :(得分:1)

由于我只是一个新手,并将子视图添加为“addSubview”,因此我遇到了问题。使用 - (void)presentModalViewController更改视图:(UIViewController *)modalViewController动画:(BOOL)动画完成了诀窍! 非常感谢kubi:)

答案 2 :(得分:0)

如果您正在寻找访问给定控制器的父级的通用方法,请查看此方法:

+ (YOURTABBARCONTROLLER*)parentTabBarController:(UIResponder*)view {
    id nextResponder = nil;
    id v = view;
    while (nextResponder = [v nextResponder]) {
         if ([nextResponder isKindOfClass:[YOURTABBARCONTROLLER class]])
            return nextResponder;
         v = nextResponder;
    }
    return nil;
 }

它将导航响应者链,以返回在那里找到的给定类型的第一个类。您可以将YOURTABBARCONTROLLER设置为UIViewController,或指定您的具体控制器类以获得更多控制权。所以,你会说,例如:

 YOURTABBARCONTROLLER* parent = [self parentTabController:self.view];

(如果self是您的子控制器并且您在其中定义了上述方法)。

这是你能找到的最接近的东西,AFAIK。该方法也可以被制作成UIViewController的一个类别,所以你总是把它放在那里。

编辑:

如果使用+,则调用如下方法:[CLASSNAME parentTabController:view],其中CLASSNAME是您定义它的类。无论如何,您可以在方法声明中使用-,它将与self一起使用。

如果它不适合您,请按照您的定义发布完整方法,以及您调用它的确切方式。您也可以添加以下行:

           NSLog(@"Found Responder: %@", nextResponder); //-- ADDED THIS

作为while循环中的第一行,以便该方法将记录它在响应者链中找到的内容。

答案 3 :(得分:0)

我同意aeoliant,使用委托模型可能更合适。这里有一个简单的解释Working with delegate in objective-c