【问题标题】:What's the best way to reverse communicate between view controllers?在视图控制器之间反向通信的最佳方式是什么?
【发布时间】:2010-10-15 16:04:52
【问题描述】:

我一直在考虑这个问题,并阅读了另一个 stackoverflow question 关于在视图控制器之间进行通信的最佳推荐方式。但是,问题/答案似乎并没有解决反向行为的最佳方法。

即要将数据从ParentController 传递到它的ModalController,我们可以像initWithDataToProcess: 一样初始化ModalController

但是如果我们想要逆向呢?我如何将新数据通知之前的控制器?

例如用户点击ParentController 上的“新人”按钮。我启动了一个新的ModalController,并通过presentModalViewController: 向用户展示了一个人编辑器视图。用户单击“完成”以添加新人。我 dismissModalViewController: 和 UI 返回到 ParentController 的视图。

在单例对象(应用程序委托或其他)中使用全局 字段 引用是不好的。 delegation(通过正式协议)和 notifications(通过 NSNotificationCenter)似乎有点矫枉过正。有什么建议吗?

【问题讨论】:

  • 在 .NET 领域,这不是问题,因为模式调用 (ShowDialog()) 是阻塞调用。使用 presentModalViewController: 的 Objective-c/Cocoa 似乎并非如此

标签: objective-c model-view-controller controllers


【解决方案1】:

使用通知通常更简洁。只需像这样添加您的观察者....

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(somethingHappened:) name:@"MyNotification" object:nil];

在您的代码中的其他地方,您可以在需要时发布通知。

[[NSNotificationCenter defaultCenter] postNotificationName:@"MyNotification" object:self];

在示例中,我传递了 self 但你可以传递任何你想要的对象,它将被提供给你的 somethingHappened: 函数

重要的是要保持@"MyNotification" 非常具有描述性和独特性。将您的项目名称添加到开头是保持事物独特性的好方法......例如。 @"ProjAXViewHasGotData"

【讨论】:

    【解决方案2】:

    委托几乎是您可以做的最低限度。如果您认为为此声明一个新协议太麻烦,只需传入父视图控制器并让模态控制器在其上调用方法。

    【讨论】:

    • 如何你“只是通过它”......并且“让模态的人调用它”? (为什么这么多人回答“你做到了......只是通过去做”......而不是告诉如何你做到了?)
    猜你喜欢
    • 2015-08-10
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多