我有大约6个小时试图找出自定义应用程序代理。即使按照教程,我最终也会出错!
我需要一种允许一个对象与另一个对象交谈的简单方法。
我有一个根视图。然后是另一个视图,然后用一个选项列表推送到堆栈。然后是另一个视图,显示基于先前选择的相关选项。
所以基本上是3个视图,当我使用popBackToRootViewController时,我需要视图3将数据传回视图1 ......这对于理论上应该如此简单的事情来说变得非常头疼。我以前只是将数据抛入nsuserdefaults,但使用的方式与苹果建议的方式相同。
请有人帮助我理解:)
答案 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)
协议和委托形式化了一个概念,即使你不遵循正式规则也能运作:它是关于声明对象相互交流的方式同样的事情,特别是在你没有或者不想控制其中一个对象的情况下,或者在事情变得复杂并且你想要一切都很好和整洁的情况下,这样就可以更容易地重用代码。
在那些情况下,一组相当小的,众所周知的信息要在两个(或更多)众所周知的物体之间来回传递,这些物体不太可能被重复使用,非正规性是相当不错的。
这意味着您可以:
正如我之前提到的,这对于胶水代码是有意义的。你不应该这样做,如果: