【问题标题】:iPhone Delegates And Making 2 Instantiated Objects Talk To One AnotheriPhone 代表并让 2 个实例化对象相互交谈
【发布时间】:2011-08-05 08:20:21
【问题描述】:

我花了大约 6 个小时来尝试制定自定义应用程序委托。即使按照教程我最终也会出错!

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

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

所以基本上是 3 个视图,当我 popBackToRootViewController 时,我需要视图 3 将数据传递回视图 1....这变得非常头疼,因为理论上应该如此简单。我之前只是将数据放入 nsuserdefaults 中,但按照苹果建议的方式使用协议。

请有人帮助我理解:)

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      Protocolsdelegation 形式化了一个即使您不遵循正式规则也有效的概念:它是关于声明一种让对象相互交谈的方式同样的事情,尤其是在您没有或不想控制其中一个对象的情况下,或者在事情变得复杂并且您希望一切都整洁的情况下,这样更容易重用代码。

      然而,在那些不太可能重复使用的两个(或多个)众所周知的对象之间来回传递相当少的、众所周知的信息集的情况下,非正式性是完全可以的。

      这意味着你可以:

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

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

      • 您在团队中工作,您正在处理一个对象,而队友正在处理另一个对象
      • 很明显,您可以在未来的项目中使用相同的功能。在这种情况下,请考虑在原始超类和特定于应用的子类之间有一个中间子类,它封装了核心功能并提供了一个正式的协议来与之交互
      • 信息交换涉及同一应用程序中不同类的对象
      • 信息交换本身相当复杂,一种(或两种)粘合方法无法涵盖它

      【讨论】:

      • 谢谢你,但我的头撞在了砖墙上......我只需要知道你在类中声明接收或发送数据的协议的位置?以及如何将类委托设置为 self 以外的任何内容。
      • 这取决于 - 协议允许数据双向流动。提供协议的类的任何一个对象都通过调用委托来发送信息,但这也可以用于轮询。我会将协议放入封装更有意义的类中。实现协议的同一个类也需要委托的属性。然后由您决定如何设置委托 - 如果您将其设为插座,您也可以在 Interface Builder 中分配它。否则,您需要在交换信息之前的任何时候以编程方式设置它。
      猜你喜欢
      • 2010-09-09
      • 2011-06-02
      • 1970-01-01
      • 2014-12-24
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      相关资源
      最近更新 更多