在NavigationControllers之间传递值/参数的最佳做法是什么?

时间:2010-08-06 06:17:26

标签: iphone uiviewcontroller

在这里提出这个问题之前,我已经google了一下。一般来说,人们建议在NavigationControllers之间传递值/参数的两种方法:

  1. 通过根ViewController中的属性
  2. 通过数据模型
  3. 我已经知道,第一选择可能不是最好的做法。很多人似乎采用了这种做法。但是,我仍然不明白第二种做法是如何实施的。有没有人碰巧知道任何教程?

    此外,是否可以通过构造函数向下传递值/参数?我想唯一的问题是从子视图控制器中获取值/参数。

2 个答案:

答案 0 :(得分:4)

此文件定义委托协议:

@protocol VCDelegate

- (void)notifyParent:(NSString*)someString;

@end

您可以将其包含在您定义的任何视图控制器的.h中。在该视图控制器中,您声明了一个ivar:

id<VCDelegate> delegate;

在您创建子视图控制器的视图控制器中,您可以像往常一样包含子视图控制器的.h。但是你添加

<VCDelegate>

表示它实现了您定义的协议,就像您指示它实现了UITableViewDelegate一样 - 您正在定义一个以相同方式工作的委托。

创建子视图控制器时:

MyChildViewController* myCVC = [[MyChildViewController alloc] initWithString:(NSString*)someString];
  myCVC.delegate = self;

所以现在子视图控制器有一个委托,它是父视图控制器,你正在创建子节点的控制器,以及将它推送到导航堆栈的控制器。您必须在父视图控制器中实现委托功能:

顺便提一下,你可以在这里向下传递信息 - 只需在创建后设置ivars,就像你委托ivar一样。您会注意到有一个initWithString将字符串传递给自定义init方法,这是传递信息的另一种方式。你仍然可以完成所有正常的初始化操作,只需另外传递数据。

- (void)notifyParent:(NSString*)someString
{
  NSLog(@"Child view controller says %@", someString);
}

然后在子视图控制器中你可以做

[self.delegate notifyParent:@"Hello"];

presto - 父VC从子VC获取数据。

答案 1 :(得分:1)

这似乎是NSNotificationCenter的工作。看看这个。 sending data to previous view in iphone