我正在构建一个音乐播放器应用程序 - 在这个应用程序中,音乐播放器视图控制器将始终位于任何其他子视图控制器(导航视图,表视图等)的顶部。我需要在任何潜在的子视图中采取的操作被发送回播放器视图控制器(例如,用户在配置文件页面上选择“播放”,然后我发送该事件)我的问题是最好的方法是什么?我提前道歉是因为有点模糊,但我已经知道有三种方法可以实现它。我只是想知道“正确”的方式是什么。
这是我想到的三种方式:
1.Delegate模式 - 将音乐播放器控制器传递给它的子控制器并将其自身设置为每当该事件传递时的委托(因为第一个视图控制器是导航视图控制器,所以我认为我是必须将它传递给几个级别,这意味着几个代表(如果我错了,请纠正我))
2.Notification Center - 为特定通知注册播放器视图控制器,封装从其他视图控制器发送的数据,以便我可以执行我的操作。
3.播放器视图控制器的类似访问 - 基本上允许从任何视图控制器访问播放器视图控制器。
任何帮助都会引导我朝着正确的方向前进。我可以通过这些方式做到这一点,但由于这是一款“学习”应用程序,我很乐意做到这一点。
答案 0 :(得分:2)
恕我直言,没有"正确的方式"。坦率地说,当我只阅读主题时,我正在考虑所有这三个。
当你想要意见时......我不会在这里推荐单身人士模式。这只是因为视图控制器可以堆叠,并且根据其性质可以多次实例化。就可维护代码(其他人的可读性)而言,我对该方法说不。
委托模式很好。但正如您所说,您必须将对此视图控制器的引用从一个视图控制器传递到下一个视图控制器。是的,有点乱。 好吧,你可以在一些单例中存储对委托的引用。这与将视图控制器设计为单例不同。
我说通知中心最适合此类数据流。消息的发件人和收件人完全脱离,并且不需要彼此了解#39;。它是各种多发送者和/或多种接收消息类型的完美模式。
好吧,正如我所说,这只是一个意见。
答案 1 :(得分:0)
我不建议广播通知(通过NSNotificationCenter),它们很难调试,其他开发人员会有问题需要理解,在您的应用程序(应用程序流程)中发生了什么,每个开发人员必须维护一个包含所有通知名称的全局列表(notificationSender和observer必须使用相同的通知名称,它们通常是常量字符串变量),观察者在收到通知后不能发回任何数据等。如果所有控制器都应该被通知同一事件,则广播真的很有帮助(对于示例登录/注销事件)。
如果可能,我认为应该始终尝试使用委托模式(具有明确定义的协议)。也许是这样的:
id <SubViewControllerEvents>musicPlayerVC= [MyMusicAppManager delegate];
if ( [musicPlayerVC respondsToSelector:@selector(userDidSelectPlay)] ) {
[musicPlayerVC userDidSelectPlay];
}