好的,我遇到了问题,但却无法找到我做错的事。
我有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。即使他们没有。有什么想法吗?
答案 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