从子视图IOS更改父视图中的数据

时间:2012-02-27 15:07:22

标签: objective-c ios

我的主(根)视图X正在使用方法populateMainScreen()中的一些数据创建。

通过单击主视图X内的一个按钮,子视图Y出现在屏幕上。

如何从Y触发这个X的populateMainScreen()方法,这会导致视图X被更改。

如果我以后的任何时间导航到它,新的更新版本应该是可见的。

3 个答案:

答案 0 :(得分:2)

在适当的MVC实现中,您将拥有X和Y的视图控制器,从一些常见的模型对象集中读取所需的数据。 Y不应该做任何特殊的事情来让X显示正确的数据; Y只需要对模型对象进行更改。然后,当X再次出现时,其控制器将再次从模型中获取所需的数据。如果模型发生变化,该变化自然会反映在X(和Y以及显示同一模型数据的任何其他视图中)。

另一种方法,如果您没有数据模型,或者如果您的模型不存储Y修改的数据,则非常有用,就是让X的控制器保持对Y控制器的引用。很可能X的控制器创建了Y的控制器(因为你指出它们之间存在父/子关系),因此X的控制器很容易在实例变量或属性中存储对Y控制器的引用。在它的-viewWillAppear方法中,X的控制器可以检查该属性;如果它不是零,它可以从Y的控制器中检索它需要的任何信息。然后将属性设置为nil:

-(void)viewWillAppear
{
    if (self.ycontroller != nil) {
        self.person.name = self.ycontroller.name;
        self.person.address = self.ycontroller.address;
        self.ycontroller = nil;
    }
}

答案 1 :(得分:1)

Superview是可访问的(如NeverBe所述),但是如果要访问视图控制器,面向对象的方式是通过委托。因此,您将Y的视图控制器上的委托属性设置为X的视图控制器,然后通过委托发送方法。您可以通过协议定义非标准方法。

您也可以像Caleb一样更新模型 - 无论哪种方式都可以。

答案 2 :(得分:0)

有几个选项

  • 让子视图发布NSNotification,让父母成为该通知的观察者,传递通知中的数据。
  • 将您的数据放在两个视图都可以引用的单个对象中
  • 给孩子一个父母方法的引用(可能通过声明一个协议)