我正在开发一个应用程序,我需要从父视图控制器中的方法更改子视图控制器的文本视图文本。
我在子VC中有一个按钮,当按下它时,视图不会改变,但调用父VC中的方法,而父VC中的另一个方法将改变子VC中文本视图的文本。
[self.delegate buttonPressed];//in child VC, call method in parent VC
在我使用故事板之前它正在工作。 在父vc中,我只有下面的代码,
childViewControler.textViewName.text=@"something";
现在我改为故事板,通过使用NSLog,我知道调用文本的方法被调用。但是没有显示文字。 我想我可能会添加一些东西,因为我现在正在使用故事板? 有人可以给我建议吗? 谢谢。
答案 0 :(得分:1)
父视图控制器中的childViewControler
变量需要指向由segue创建的子视图控制器类的实例。如果您没有为其指定任何内容,则为nil
,并且任何消息都不会执行任何操作。
从您发布的代码中不清楚它是属性,实例变量还是局部变量;以下是使用实例变量的方法:
@implementation ParentViewController
{
ChildViewController *childViewController;
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// if you have multiple segues, check segue.identifier
// so you only do this for the correct segue
childViewController = segue.destinationViewController;
}
- (void)buttonPressed
{
childViewController.textViewName.text=@"something";
}
@end
关键位在prepareForSegue:sender:
中 - 您需要确保childViewController
变量指向segue创建的视图控制器。
您的问题也可能是因为仍然有一些旧的故事前代码alloc
和init
是一个子视图控制器并将其放入childViewController
变量中。在这种情况下,您将拥有该视图控制器类的两个实例:由segue创建的实例和您创建的实例。只有segue创建的那个被挂钩到UI中,因此您对另一个所做的任何更改都将不可见。您可以通过删除任何创建并呈现子视图控制器的代码来解决此问题 - 故事板现在处理所有这些,prepareForSegue:sender:
是获取子视图引用所需的唯一位置控制器。