0

我正在开发一个应用程序,我需要从父视图控制器中的方法更改子视图控制器的文本视图的文本。

我在子 VC 中有一个按钮,当按下它时,视图不会改变,但是会调用父 VC 中的一个方法,而父 VC 中的另一个方法会更改子 VC 中文本视图的文本。

[self.delegate buttonPressed];//in child VC, call method in parent VC

在我使用情节提要之前它正在工作。在父vc中,我只有下面的代码,

childViewControler.textViewName.text=@"something";

现在我改为storyboard,通过使用NSLog,我知道改变文本的方法被调用了。但不显示任何文字。我想我可能会添加一些东西,因为我现在正在使用故事板?有人可以给我建议吗?谢谢你。

4

1 回答 1

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 创建的视图控制器。


您的问题也可能是由于仍然有一些旧的故事板代码allocinit子视图控制器并将其放入您的childViewController变量中。在这种情况下,您将拥有该视图控制器类的两个实例:由 segue 创建的一个和您创建的一个。只有由 segue 创建的一个被连接到 UI 中,因此您对另一个所做的任何更改都将不可见。您可以通过摆脱创建和呈现子视图控制器的任何代码来解决这个问题——故事板现在负责所有这些,并且prepareForSegue:sender:是您唯一需要获取对子视图控制器的引用的地方。

于 2012-07-17T15:26:33.480 回答