java – 从应用程序的非Ui部分处理导航?

注意:当我谈论应用程序后端时,我不是指服务器后端。应用程序后端是应用程序的一部分。这是应用程序的非ui部分。

我有一个代码设计问题。使用j2objc Java用作iOS应用程序的后端,前端仍然是Objective-C。

在这个模型中哪个部分(前端或后端)应该控制导航?

请考虑以下几点。初始ViewController已加载。用户敲击一个按钮。以下是两种可能的情况:

>前端接收手势并打开请求的ViewController
>前端收到手势并将操作报告给Java后端。 Java后端决定接下来打开哪个页面,并告诉前端哪个ViewController被显示。

对我来说,第二个解决方案似乎在代码分离的过程中更加有意义。但是有一个问题出现在我身上。假设您的应用程序中具有以下ViewController结构:

首页:UIViewController主要:UINavigationViewController
>> Main-TabPage1:UIPageViewController
>> Main-TabPage2:UIPageViewController
>> Main-TabPage3:UIPageViewController设置:UIViewController

如果您在应用程序的级别上进行导航,则很简单。你只需要告诉前端打开Startpage,Main或Settings。但是,用什么方法点击按钮去Main> Main-TabPage3从起始页或从主页>主TabPage1。您必须执行以下操作:

>如果你在开始页面:你必须告诉前端它应该检查Main,然后Main TabPage3。
>如果你在Main> Main-TabPage1:你必须告诉前端它应该只是显示Main-TabPage3。

您看到这样一个简单页面方案的事件显示了Java后端的ViewController似乎有很多情况需要考虑。

这是从Java后端揭示视图的有效方法,还是看到更好的方式呢?

一个很好的做法是将应用程序分为两部分:

域:包含用于远程通信的所有服务类(即,如果您需要远程后端)以及与业务逻辑相关的每个类和模型。这部分是使用j2objc的部分,并且希望它与用户界面无关。

UI:所有的ViewControllers和Views都属于这里。

为什么它们彼此不同?

一旦你设置了所有的业务逻辑,你应该很好地生成你的代码与j2objc并保持几何不变。另一方面,您的UI可能会在您的应用程序的使用寿命内发生变化(请记住iOS 7如何强制每个开发人员刷新其应用程序的可视化)。您希望在域或UI中保留更新,从而影响到其他部分。

他们如何一起工作?

按照一个动作(即按一下按钮),您可以询问域是否满足某些先决条件(即是新用户吗?),然后实例化ViewController进行显示。 UI可能会向域内提供数据或要求一些数据,但是它有责任实例化Views / ViewControllers。

复杂路由

在我需要能够根据远程推送通知或基于某些复杂逻辑导航的应用中,我倾向于让一个对象(称为“路由器”)处理所有这些。它仍然驻留在UI部分中,并且将它传递给作出决定所需的域对象。然后它返回一个描述导航堆栈的导航对象(它可以是处理类似于URL的字符串的对象),您可以递归地向您提供viewController。

让您的“路由器”对象将导航对象“firstVC / secondVC / thirdVC”返回给AppDelegate。 AppDelegate可以调用返回“firstVC”的dequeue方法,并且基于此实例化一个“firstViewController”对象以添加到UINavigationController的堆栈中。然后将“路由器”对象传递给新近实例化的ViewController,该控制器也称为出队方法来接收“secondVC”。基于此,“firstViewController”将实例化一个“secondViewController”对象以添加到UINavigationController的堆栈中。然后,它会将相同的“路由器”对象传递给“secondViewController”对象,并且再次调用dequeue方法获取“thirdVC”并实例化适当的ViewController。

这样,您可以通过让每个ViewController实例化其所了解的另一个ViewController来构建您的导航堆栈(在我之前的例子中,“firstViewController”知道“secondViewController”,因为它的视图具有允许用户达到“secondViewController”视图的按钮,但不知道“thirdViewController”)。

您也可以让AppDelegate构建整个导航堆栈,但是由于您的“firstViewController”已经为按钮工作导入了“secondViewController”标题,最好让他执行与该ViewController相关的工作等。

工作样品

Here is a demo project我做了说明我刚刚曝光的事情。

“域”文件夹中包含的类可能是您使用j2objc生成的类。 AppDelegate中的buildNavigationStack方法使用“Router”对象构建功能导航堆栈。我将这个项目的框架简单化,同时展示了一些模式,比如集中式的工厂。有组织的类实例,以及封装模型对象和输出数据的viewData准备显示。这可以通过几个协议来改进,使事情更抽象,但是为了简化,我试图保持简单。

http://stackoverflow.com/questions/29704006/handling-navigation-from-a-non-ui-part-of-an-app

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:java – 从应用程序的非Ui部分处理导航?