Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 具有共享数据的应用程序的初始点_Ios_Objective C_Uitabbarcontroller_Viewcontroller - Fatal编程技术网

Ios 具有共享数据的应用程序的初始点

Ios 具有共享数据的应用程序的初始点,ios,objective-c,uitabbarcontroller,viewcontroller,Ios,Objective C,Uitabbarcontroller,Viewcontroller,以下是我的iOS应用程序的结构: / NavigationController -> ViewController -> ... TabBarController - NavigationController -> ViewController -> ... \ NavigationController -> ViewController -> ... TabBarController位于应

以下是我的iOS应用程序的结构:

                 / NavigationController -> ViewController -> ...
TabBarController - NavigationController -> ViewController -> ...
                 \ NavigationController -> ViewController -> ...
TabBarController位于应用程序的初始点,具有3个选项卡,然后通过NavigationController开始通过ViewController进行导航

我需要在应用程序中的一个位置,可以访问NavigationController中嵌入的每个ViewController。假设它是一个控制器,它是一些通知的观察者,并向ViewController发送数据。启动应用程序后,该控制器还需要执行一些操作

我的问题是这个控制器应该放在应用程序中的什么位置。第一个想法是将所有代码放入TabBarController,因为它是初始点,所以它可以在启动后执行操作,并可以通过NavigationController访问ViewController。但TabBarController是唯一的容器,所以它不应该包含与导航无关的附加代码,对吗

下一个想法是将ViewController放在TabBarController之前,以便ViewController是应用程序的初始点。在
viewdiload
上,我执行一些启动时必须执行的操作,然后注册观察员以获取通知,并在
viewdilease
上显示TabBarController。但问题是,当我想将数据传递给ViewController时,这些数据必须通过两个容器(TabBarController和NavigationController)发送,这看起来相当复杂


你觉得怎么样?我应该为此使用TabBarController还是创建新的ViewControler作为新的初始点?或者我应该使用应用程序delagate吗?谢谢

有很多可能的解决方案。看起来您的控制器甚至不需要是视图控制器,因为它的实际职责是数据

因此,我建议创建一个视图控制器,它基本上是启动映像的副本,可能有一个进度指示器,但它所做的只是坐在那里等待——没有逻辑。逻辑位于它(或应用程序委托)触发的数据控制器中。逻辑完成后,“launch VC”会得到一个回调并推送到tab控制器


现在您可以选择注入、单例引用或观察数据控制器如何与选项卡通信。如果视图控制器没有向数据控制器发出请求,那么观察数据事件似乎是最好的选择。如果他们这样做,那么注入可能是最好的。

所以我应该创建ViewController,它有两个角色(启动屏幕和通知观察员)。初始代码运行时,启动屏幕可见。完成后,ViewController将推送到TabBarController,但即使TabBarController位于顶部,它仍然可以处理通知。对的接下来就是传递数据。依赖项注入对我的情况很好,但是如何将对象引用传递给ViewController呢?我必须先将引用发送到TabBarController,然后再发送到NavigationController,再发送到ViewController?任何东西都可以处理通知。我可能会将启动VC与作为代理的进度联系得稍微紧密一些,而不是使用通知。对于注入,您通常会传递到选项卡控制器,然后从那里开始是(不是传递到导航控制器,而是传递到导航根控制器)。实际上,当我认为我根本不需要初始代码时。我只需要启动应用程序后创建的一些对象,这个对象会侦听两个系统通知。若它将收到一个通知,它将对象引用发送给VC,若它收到第二个通知,它将发送null。但是谁应该创建这个对象呢?AppDelegate?是的,这可能是应用程序代表的责任。如果它是最小的,并且它们是系统通知,那么它实际上可以由应用程序委托本身完成……是的。它们只是两个通知。问题解决了。谢谢