注意:当我谈论App后端时,我不是指服务器后端.App后端是应用程序的一部分.它是应用程序的非ui部分.
我有一个代码设计问题.使用j2objc Java用作iOS应用程序的后端,前端仍然是Objective-C.
哪个部分(前端或后端)应控制此模型中的导航?
考虑以下.最初的ViewController已加载.用户点击了一个按钮.以下是两种可能的情况:
前端接收手势并打开请求的ViewController
前端接收手势并将动作报告给Java后端.Java后端决定下一个要打开的页面,并告诉前端要显示哪个ViewController.
对我来说,第二种解决方案在代码分离方面似乎更有意义.但是我遇到了一个问题.假设您的应用程序中有以下ViewController结构:
UIViewController主要: UINavigationViewControllerUIPageViewControllerUIPageViewControllerUIPageViewController设置: UIViewController如果您在应用程序的级别导航,则很简单.您只需告诉前端打开Startpage,Main或Settings.但是,有什么用途点击按钮从"起始页"或从Main> Main-TabPage1转到Main> Main-TabPage3.您必须执行以下操作:
你看到这样一个简单的页面方案的事件揭示了Java后端的ViewController似乎有很多需要考虑的案例.
这是从Java后端泄露视图的有效方式,还是看到更好的方法?
假设您有一个跨平台应用程序.该应用程序在Android和iOS上运行.您在两个平台上的共享语言都是Java.通常,您将使用Java编写业务逻辑,并使用Java(适用于Android)和Objective-C(适用于iOS)编写所有UI特定部分.
通常,当您在跨平台,跨语言应用程序中实现MVP模式时,您将拥有Java中的Model和Presenter,并为您的演示者提供了一个Java界面.这样,您的共享Java演示者可以与您在平台特定部分上使用的任何视图实现进行通信.
让我们假设我们想要编写一个带有Java部分的iOS应用程序,以后可以使用相同的Android应用程序进行共享.以下是设计的图形表示:

在左侧有Java部分.在Java中,您可以编写模型,控制器以及视图界面.使用依赖注入进行所有连线.然后可以使用J2objc将Java代码转换为Objective-C .
在右侧,您有Objective-C部分.在这里,您UIViewController可以实现Java接口,这些接口转换为ObjectiveC协议.
问题:
我正在努力的是如何进行视图之间的导航.假设你在UIViewControllerA上,然后点击一个按钮,它会带你到UIViewControllerB.你会怎么做?
情况1:

您将按钮点击报告给UIViewControllerA的Java ControllerA(1),Java ControllerA调用链接到UIViewControllerB(3)的Java ControllerB(2).然后,您遇到的问题是Java Controller端不知道如何在Objective-C View层次结构中插入UIViewControllerB.您无法从Java端处理此问题,因为您只能访问View接口.
案例2:

您可以转换到UIViewControllerB,无论它是模态还是UINavigationController或其他(1).然后,首先需要正确的UIViewControllerB实例,该实例绑定到Java ControllerB(2).否则,UIViewControllerB无法与Java ControllerB(2,3)进行交互.当您拥有正确的实例时,您需要告诉Java ControllerB已经显示了View(UIViewControllerB).
我仍在努力解决如何处理不同控制器之间导航的问题.
如何在不同控制器之间建模导航并适当地处理跨平台视图更改?
在集成我的j2objc转换的java库时,我收到了这条消息.
ld:警告:紧急:为watchOS模拟器构建,但链接在为iOS构建的目标文件(/Users/admin/Documents/j2objc/dist/lib/libjre_emul.a(IOSArray.o))中.注意:将来这将是一个错误.
我不明白我的代码是否适用于真正的watchOS设备?或者这只是一个仅在模拟器中运行的i386构建?在这种情况下我需要做什么?
Model-View-Presenter(MVP)是一种众所周知的GUI应用程序设计模式.对于Android,在普通Java模块中实现业务逻辑有助于测试而无需Android模拟器.
但是,由于Android应用程序GUI的特殊要求,我在Android上实现模式时遇到了困难:
可以在任何时候销毁活动(来电,用户按下主页按钮,......),并且在重新创建时,它应该处于与其离开时完全相同的状态.这与大多数其他GUI应用程序不同.
活动可以经历许多生命周期状态.可能会暂停,在这种情况下,不应修改活动的UI.例如,如果某些数据在后台加载,则如果它处于暂停状态,则无法将其传递给MVP(Activity)的View部分.同样,这是一个不寻常的要求.
我已经阅读了MVP for Android的博客文章并查看了示例源代码.我试图通过使用MVP模式实现的最终目标是能够使用转换器j2objc将所有业务逻辑转换为Objective-C ,这样在iOS上实现相同的应用程序时可以重用业务逻辑.
有没有人成功实现了Android的MVP模式,在这种情况下,我错过了什么?
我是iOS的新手,从Android开发转向.
我们有一个Android应用程序,它有几个库,我们使用J2ObjC转换为Objective C.
我已经逐渐将这些图书馆带到了现在,所以很好.
但是,在翻译谷歌的GSON库后,我遇到了一个问题,如果我尝试使用翻译的方法,toJsonWithId我会遇到问题:
let gson = ComGoogleGsonGson()
let swiftTest = GsonSwiftTest()
swiftTest.name = "Ricky"
print(gson.toJsonWithId(swiftTest))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
libc ++ abi.dylib:以JavaLangAssertionError类型的未捕获异常终止
进一步显示:
由于未捕获的异常'JavaLangAssertionError'而终止应用程序,原因:'未知的Java类型编码'
我的Swift课程是:
import Foundation
@objc
public class GsonSwiftTest : NSObject {
var name:String?
}
Run Code Online (Sandbox Code Playgroud)
如果我在我的Swift项目中使用Objective C类,将它添加到桥接头并使用Objective C类它可以正常工作.
我相信这是我的一个误解,但我找不到为什么这不起作用的答案.检查J2ObjC源代码显示无法找到类的类型时引发错误.
如果有人可以帮助解释这个问题的原因,我们将不胜感激.
谢谢!
我使用J2objc将Java转换为Objective-C.这个代码我用一个桥接头来使它在Swift中可用.这是我翻译的Java Enum:
public enum BTestType {
Type1, Type2, Type3;
}
Run Code Online (Sandbox Code Playgroud)
在Objective-C中,我得到以下头文件(我跳过模块文件):
#ifndef _BISBTestType_H_
#define _BISBTestType_H_
#include "J2ObjC_header.h"
#include "java/lang/Enum.h"
typedef NS_ENUM(NSUInteger, BISBTestType) {
BISBTestType_Type1 = 0,
BISBTestType_Type2 = 1,
BISBTestType_Type3 = 2,
};
@interface BISBTestTypeEnum : JavaLangEnum < NSCopying >
#pragma mark Package-Private
+ (IOSObjectArray *)values;
FOUNDATION_EXPORT IOSObjectArray *BISBTestTypeEnum_values();
+ (BISBTestTypeEnum *)valueOfWithNSString:(NSString *)name;
FOUNDATION_EXPORT BISBTestTypeEnum *BISBTestTypeEnum_valueOfWithNSString_(NSString *name);
- (id)copyWithZone:(NSZone *)zone;
@end
J2OBJC_STATIC_INIT(BISBTestTypeEnum)
FOUNDATION_EXPORT BISBTestTypeEnum *BISBTestTypeEnum_values_[];
#define BISBTestTypeEnum_Type1 BISBTestTypeEnum_values_[BISBTestType_Type1]
J2OBJC_ENUM_CONSTANT_GETTER(BISBTestTypeEnum, Type1)
#define BISBTestTypeEnum_Type2 BISBTestTypeEnum_values_[BISBTestType_Type2]
J2OBJC_ENUM_CONSTANT_GETTER(BISBTestTypeEnum, Type2)
#define BISBTestTypeEnum_Type3 BISBTestTypeEnum_values_[BISBTestType_Type3]
J2OBJC_ENUM_CONSTANT_GETTER(BISBTestTypeEnum, Type3) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用文件夹引用模式将许多 Objective-C 文件添加到我的 Swift 项目中,这意味着当我将文件拖放到项目中时,我选择“创建文件夹引用”。
这是因为我所有的 obj-c 文件都使用#include "/folder/folder/folder/"example. 这些文件是用j2objc生成的项目生成的。
现在我的问题是当我想要#import或Xcode 中的#include某些.h文件myproject-Bridging-Header.h找不到头文件时。我用#import "/folder/folder/folder/"类似生成的文件,但没有机会。
我$(PROJECT_DIR)/在构建设置 - 搜索标头路径中添加,但它确实需要完全像$(PROJECT_DIR)/folder/folder/folder/. 有什么方法可以设置主文件夹和 Xcode 查找子文件夹吗?或者我需要单独写每个路径?
我希望开始进行移动开发(特别是 iOS),虽然我通常很擅长学习语言,但 Objective-C 几乎每时每刻都让我感到困惑。所以,看看 j2objc(因为我已经知道 Java),我认为它可能符合我正在寻找的东西。
不过,我的问题非常简单:转换器能否正确处理我的源代码引用(例如,仅二进制(字节码)JAR 文件中的 Apache Commons 代码)的情况?
使用j2objc时,确定当前平台(Android与iOS)的最佳方法是什么?
或者更一般的问题:如何在Android和iOS上使用不同的代码,例如在处理数据库访问或网络时?
我之前使用过旧版本的Google Java到Objective-C(J2ObjC)转换器(即版本0.5.2),并且可以直接将整个Java文件夹转换为等效的Objective-C文件(并保留这样做的目录结构).我只需要运行以下shell可执行文件:
$ ./run.sh —-preservedirs <path to input folder>
Run Code Online (Sandbox Code Playgroud)
我刚刚下载了最新版本的J2ObjC(即版本0.9.1),并且从入门页面或其他地方不清楚如何使用'j2obc'翻译整个Java文件文件夹而不是单个Java文件可执行文件." 入门"页面中提供的唯一示例是翻译单个Java文件,该文件在其他地方没有依赖项/导入,如下所示:
$ ./j2objc Hello.java
Run Code Online (Sandbox Code Playgroud)
假设我有一个名为'input'的文件夹,其中包含所有要翻译的子包和Java文件的'com'包,任何人都可以提供一个如何翻译整个包的示例吗?