iPhone代表并使2个实例化对象相互通信

时间:2011-08-05 08:20:22

标签: iphone objective-c ios cocoa-touch ios4

我有大约6个小时试图找出自定义应用程序代理。即使按照教程,我最终也会出错!

我需要一种允许一个对象与另一个对象交谈的简单方法。

我有一个根视图。然后是另一个视图,然后用一个选项列表推送到堆栈。然后是另一个视图,显示基于先前选择的相关选项。

所以基本上是3个视图,当我使用popBackToRootViewController时,我需要视图3将数据传回视图1 ......这对于理论上应该如此简单的事情来说变得非常头疼。我以前只是将数据抛入nsuserdefaults,但使用的方式与苹果建议的方式相同。

请有人帮助我理解:)

2 个答案:

答案 0 :(得分:1)

有不同的方法来解决这个问题。首先,您可以反复将第一个View传递给您正在进行更改的视图,然后调用视图方法1.我不建议这样做。 另一种更简单的方法是使用Notifications。只需在通知中心[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(somethingChanged) name:@"aStringWichIsUniqeForCallingSomethingChanged" object:nil];注册您的第一个视图即可。你必须提供并实现一个回调方法(在我的例子中是somethingChanged)。在你的子视图中,事情发生了,你必须通过[[NSNotificationCenter defaultCenter] postNotificationName:@"aStringWichIsUniqeForCallingSomethingChanged" object:nil];发布通知。如果不再需要,请不要忘记从通知中心删除视图! [[NSNotificationCenter defaultCenter] removeObserver:self]; 第三种可能性是使用singelton(如app委托),其中包含应该进行通信的所有视图。简单地将所有视图都视为ivars&在这个单例中它们的属性,并在每个方法中实现,如果有什么变化应该调用它们。然后拨打[[singelton sharedInstance] view1] somethingChanged]

如果我说View,我的意思是viewController,但我懒得写出来。 ;) 希望,这有帮助!

答案 1 :(得分:0)

协议委托形式化了一个概念,即使你不遵循正式规则也能运作:它是关于声明对象相互交流的方式同样的事情,特别是在你没有或者不想控制其中一个对象的情况下,或者在事情变得复杂并且你想要一切都很好和整洁的情况下,这样就可以更容易地重用代码。

在那些情况下,一组相当小的,众所周知的信息要在两个(或更多)众所周知的物体之间来回传递,这些物体不太可能被重复使用,非正规性是相当不错的。

这意味着您可以:

  • 发送对象提供接收对象类型的属性
  • 接收对象中实现一个方法,该方法将信息作为参数发送
  • 在某些时候,例如在根控制器推送成为发送对象的子节点的情况下,接收对象将自己设置为发送对象
  • 如果发送对象有要发送的信息,它会使用对接收对象的引用向其发送一条消息,调用前面提到的方法,并将信息作为参数

正如我之前提到的,这对于胶水代码是有意义的。你不应该这样做,如果:

  • 你在一个团队工作,你正在研究一个物体而一个队友在另一个物体上工作
  • 很明显,您可以在将来的项目中使用相同的功能。在这种情况下,考虑在原始超类和特定于应用程序的子类之间建立一个中间子类,一个封装核心功能并提供与之接口的正式协议
  • 信息交换涉及同一个应用程序中不同类的对象
  • 信息交换本身相当复杂,一种(或两种)胶水方法无法覆盖它