将数据从子视图传递到父视图 - iPhone

时间:2011-07-16 23:38:50

标签: iphone objective-c xcode

我有两个控制器类A和B.一个实例化几个B.当在A中按下相应的按钮时,A实例化一个B并且程序流被传递给B.在B的运行结束时我希望它通过一些数据回到A.这怎么可能?

更确切地说,我有一个NSArray of Objects,我想在B运行其最后一个方法后返回'A'...

3 个答案:

答案 0 :(得分:3)

很多选择:

  1. 将您的数据保存在两个VC可以引用的单个DataManager对象中
  2. 让B发布NSNotification,表明已完成,并让A成为该通知的观察者,传递通知中感兴趣的数据。
  3. 在A中为B提供对iVar的引用,以便它可以直接设置值
  4. 给B一个A中的方法的引用(可能通过声明一个协议),这样它就可以调用该方法并以这种方式传递数据库。
  5. 可能更多,但这些是我经常使用的。

答案 1 :(得分:1)

正如Ray所说,有很多方法,但最简单的方法是将A的实例作为参数传递给B的初始值设定项,然后调用A.whatever(...)传回数据。定义和使用whatever(...)方法作为非正式协议可能最容易 - 你知道它存在,并且两个模块知道它存在,但代码中没有任何特定的要求它存在。

如果您希望有一种方法可以声明B需要一个对象来回调并指定该对象必须能够执行的操作,那么您可以设置一个正式的协议。这可能会说您需要一个对象,不一定是A,而是符合MyBCallbackProtocol的任何对象,您定义为需要具有whatever(...)的一个实例方法。正式协议允许编译器检查您传入的对象是否肯定支持您想要的方法调用。

这种情况可能有些过分 - 但如果AB之间的沟通变得更加复杂,您可能希望使用它来确保您已经实施了所有方法。我决定你需要。如果更改了A,则协议有助于确保B仍然能够传回其信息。

如果AB非常特定于您的应用,则NSNotificationCenter也可能过度。但是,它确实完全隔离B,同时允许其他人从中获取数据;如果B是一个可重复使用的实用程序类,那么值得考虑。

我不会在A中提到ivar;这让B的方式也参与了A的业务。

答案 2 :(得分:0)

有几种方法可以实现这一点,最简单,最快速的解决方案是使用NSNotificationCenter。使用NSNotificationCenter,您可以订阅和发送自定义通知。

NSNotificationCenter: 接收

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didFinishParsing:) name:@"yourNoticationName" object:nil];
- (void)didFinishParsing:(NSNotification *)aNotification {...}

发送

NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"some", @"optional", @"data", @":)" nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"yourNoticationName" object:nil userInfo:userInfo];