处理来自应用程序的非Ui部分的导航?

18 java objective-c ios swift j2objc

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

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

哪个部分(前端或后端)应控制此模型中的导航?

考虑以下.最初的ViewController已加载.用户点击了一个按钮.以下是两种可能的情况:

  1. 前端接收手势并打开请求的ViewController

  2. 前端接收手势并将动作报告给Java后端.Java后端决定下一个要打开的页面,并告诉前端要显示哪个ViewController.

对我来说,第二种解决方案在代码分离方面似乎更有意义.但是我遇到了一个问题.假设您的应用程序中有以下ViewController结构:

  • 起始:UIViewController主要: UINavigationViewController
  • > Main-TabPage1: UIPageViewController
  • > Main-TabPage2: UIPageViewController
  • > Main-TabPage3:UIPageViewController设置: UIViewController

如果您在应用程序的级别导航,则很简单.您只需告诉前端打开Startpage,Main或Settings.但是,有什么用途点击按钮从"起始页"或从Main> Main-TabPage1转到Main> Main-TabPage3.您必须执行以下操作:

  • 万一你在Startpage:你必须告诉前端它应该审查Main,然后是Main TabPage3.
  • 万一你在Main> Main-TabPage1:你必须告诉前端它应该只显示Main-TabPage3.

你看到这样一个简单的页面方案的事件揭示了Java后端的ViewController似乎有很多需要考虑的案例.

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

Ruf*_*fel 4

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

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

UI:所有 ViewController 和 View 都属于这里。

为什么它们彼此不同?

一旦您设置了所有业务逻辑,您应该可以使用 j2objc 生成代码并使其几乎保持不变。另一方面,您的 UI 可能会在应用程序的生命周期中发生很大变化(记住 iOS 7 如何迫使每个开发人员刷新其应用程序的视觉效果)。您希望保持UI中的更新不影响其他部分。

他们如何一起工作?

在执行操作(即点击按钮)之后,您可以询问域是否满足某些先决条件(即它是新用户吗?),然后实例化一个 ViewController 进行显示。UI可以向提供数据或请求一些数据,但实例化 Views/ViewControllers 是它的责任

复杂的路由

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

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

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

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

工作样本

这是我制作的一个演示项目,用于说明我刚刚公开的内容。

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