java - 处理来自应用程序的非 UI 部分的导航?

标签 java ios objective-c swift j2objc

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

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

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

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

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

  • 对我来说,第二种解决方案似乎在代码分离方面更有意义。但是有一个问题发生在我身上。假设您的应用中有以下 ViewController 结构:
  • 起始页:UIViewController主营:UINavigationViewController
  • > Main-TabPage1: UIPageViewController
  • > Main-TabPage2: UIPageViewController
  • > Main-TabPage3: UIPageViewController设置:UIViewController

  • 如果您在应用程序的“到”级别导航,这很简单。您只需告诉前端打开 Startpage、Main 或 Settings。但是,点击一个按钮从 Startpage 或 Main > Main-TabPage1 转到 Main > Main-TabPage3 有什么用。您必须执行以下操作:
  • 如果您在起始页上:您必须告诉前端它应该查看 Main,然后是 Main TabPage3。
  • 如果您在 Main > Main-TabPage1:您必须告诉前端它应该只显示 Main-TabPage3。

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

    这是从 Java 后端显示 View 的有效方式,还是您看到更好的方式?

    最佳答案

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

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

    用户界面 : 所有的 ViewControllers 和 Views 都属于这里。

    为什么它们彼此不同?

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

    他们如何一起工作?

    在一个 Action 之后(即点击一个按钮),你可以询问域是否满足一些先决条件(即它是一个新用户吗?),然后你实例化一个 ViewController 来显示。 用户界面 可将数据提供给 域名 或要求一些,但实例化 Views/ViewControllers 是它的责任。

    复杂的路由

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

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

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

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

    工作样本

    Here is a demo project我做了说明我刚刚曝光的内容。

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

    关于java - 处理来自应用程序的非 UI 部分的导航?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29704006/

    相关文章:

    java - 实现类似 Eclipse 的 OSGi 启动器

    java - sikuli 1.0.2 文档和 ScreenRegion

    java - 在单元测试中组织测试

    ios - 将自定义坐标设置为函数,Waze Integration

    objective-c - 复制 UIView

    ios - 选中/取消选中时 Objective-C 突出显示 UIButton

    objective-c - retainCount 增加或减少的条件

    iphone - 如何在 UITableViewCell 中动态调整两个文本标签的宽度?

    java - 如何使用两个jsons使用 secret 来在java中向google进行身份验证

    objective-c - 台风1.7.2 : XML Injection - Unable to resolve class