将数据从任何视图控制器传递到 iOS 中的一个主视图控制器

Posted

技术标签:

【中文标题】将数据从任何视图控制器传递到 iOS 中的一个主视图控制器【英文标题】:Pass data from any view controller to one master view controller in iOS 【发布时间】:2014-04-20 20:35:16 【问题描述】:

我正在构建一个音乐播放器应用程序——在这个应用程序中,音乐播放器视图控制器将始终位于任何其他子视图控制器(导航视图、表格视图等)之上,我需要在任何潜在的子视图中采取行动被发送回播放器视图控制器(例如,用户在个人资料页面上选择“播放”,然后我将该事件发送回) 我的问题是最好的方法是什么?我提前道歉有点含糊,但我已经知道我可以实现它的三种方法。我只想知道什么是“正确”的方式。

这是我想到的三种方式:

1.Delegate 模式——将音乐播放器控制器传递给它的子控制器,并将其自身设置为每当传递该事件时的委托(因为第一个视图控制器是导航视图控制器,所以我想我会必须将它向下传递几个级别,这意味着几个代表(如果我错了,请纠正我))

2.Notification Center -- 为特定通知注册播放器视图控制器,封装从其他视图控制器发送的数据,以便我可以执行我的操作。

3. 播放器视图控制器的单例访问 - 基本上允许从任何视图控制器访问播放器视图控制器。

感谢任何帮助引导我朝着正确的方向前进。我可以通过这两种方式中的任何一种来做到这一点,但由于这是一个“学习”应用程序,我很想把它做好。

【问题讨论】:

如何让您的音乐播放器视图控制器始终位于顶部?什么是控制器层次结构? 我有一个“播放器视图控制器”,这个视图控制器有一个指向导航控制器的容器视图。导航控制器处理一切,除了播放器本身,它是从“播放器视图控制器”上的框架底部弹出的一组视图 好的,那么我不喜欢为该结构使用通知。听起来您只是将信息发送到一个对象,即容器视图控制器。您可以使用 self.view.window.rootViewController 从任何其他控制器访问该控制器,并使用该引用来调用该控制器中的任何方法或设置任何属性值。 【参考方案1】:

恕我直言,没有“正确的方法”。坦率地说,当我只阅读主题行时,我想到了他们三个。

当您征求意见时...我不推荐这里的单例模式。这只是因为视图控制器可以堆叠并且本质上可以多次实例化。就可维护代码(其他人的可读性)而言,我会拒绝这种方法。

委托模式很好。但是正如您所说,您必须将对此视图控制器的引用从一个视图控制器传递到下一个视图控制器。是的,有点乱。 好吧,您可以在某个单例中存储对委托的引用。这与将视图控制器设计为单例不同。

我会说通知中心最适合这种类型的数据流。消息的发送者和接收者完全分离,不需要“互相认识”。它是所有类型的多个发送者和/或多个接收者类型的消息的完美模式。

好吧,正如我所说,这只是一个意见。

【讨论】:

我按照您的建议结束了通知中心,并使用 userInfo 传递数据。在接受之前会稍等一下,看看是否有人有任何其他 cmets.. 谢谢! 我认为通知模式是最好的解决方案!【参考方案2】:

我不推荐广播通知(通过 NSNotificationCenter),它们很难调试,其他开发人员会有问题要理解,你的应用程序(应用程序流程)中发生了什么,每个开发人员都必须维护一个包含所有通知名称的全局列表(notificationSender 和observer 必须使用相同的通知名称,它们通常是常量字符串变量),observer 收到通知后不能发回任何数据等。广播真的很有帮助,如果应该通知所有控制器相同的事件(对于例如登录/注销事件)。

如果可能,我认为应该始终尝试使用委托模式(具有明确定义的协议)。可能是这样的:

id <SubViewControllerEvents>musicPlayerVC= [MyMusicAppManager delegate];
if ( [musicPlayerVC respondsToSelector:@selector(userDidSelectPlay)] ) 
   [musicPlayerVC userDidSelectPlay];

【讨论】:

以上是关于将数据从任何视图控制器传递到 iOS 中的一个主视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

将 Firebase 数据从一个视图控制器传递到详细视图控制器

如何在容器视图和主视图控制器之间正确传递数据

如何将数据从一个视图传递到 IOS 中的另一个视图控制器?

如何从照片库 IOS 7 返回主视图控制器

如何将 JSON 值从一个 ViewController 传递到另一个

如何在每个控制器中不重复代码的情况下将模型传递给我的主视图模板?