tutorial - java to objective c converter online
¿Manejar la navegación desde una parte no Ui de una aplicación? (2)
Nota: cuando hablo de la aplicación Backend no me refiero al servidor Backend. El backend de la aplicación es parte de la aplicación. Es la parte no ui de la aplicación.
Tengo una pregunta de diseño de código. El uso de j2objc Java se usa como backend de una aplicación iOS, donde el frontend sigue siendo Objective-C.
¿Qué parte (front-end o backend) debería controlar la navegación en este modelo?
Considera lo siguiente. Se ha cargado el ViewController inicial. El usuario pulsó un botón. Aquí hay dos casos posibles:
La parte frontal recibe el gesto y abre el ViewController solicitado.
el extremo frontal recibe el gesto e informa la acción al backend de Java. El backend de Java decide qué página abrir a continuación y le dice al extremo frontal qué ViewController debe revelarse.
Para mí, la segunda solución parece tener más sentido en los turnos de separación de código. Pero hay un problema que se me ocurrió. Supongamos que tiene la siguiente estructura ViewController en su aplicación:
- Página de
UIViewController
:UIViewController
Principal:UINavigationViewController
- > Main-TabPage1:
UIPageViewController
- > Main-TabPage2:
UIPageViewController
- > Main-TabPage3: Configuración de
UIViewController
:UIViewController
Si navegas en el nivel de la aplicación es simple. Simplemente dile a la página de inicio, página principal, principal o Configuración. Pero, ¿qué uso usó un botón para ir a Main> Main-TabPage3 desde Startpage o desde Main> Main-TabPage1? Tienes que hacer lo siguiente:
- en caso de que esté en la página de inicio: debe decirle al extremo frontal que debe revisar Main y luego Main TabPage3.
- En caso de que esté en Main> Main-TabPage1: tiene que decirle al extremo frontal que solo debe revelar Main-TabPage3.
Verá que el evento para un esquema de página tan simple que revela un ViewController desde el back end de Java parece tener muchos casos que considerar.
¿Es esta una forma válida de revelar vistas desde un back end de Java o ve alguna forma mejor de hacerlo?
Creo que una buena manera es enviar una notificación local desde el Backend de la aplicación y dejar que la vista responda a ella y mostrar el ViewController correcto con un pellizco que si la vista no está visible, debería hacer la acción a la vista.
por ejemplo, en el caso de que haya explicado que el código será el siguiente:
Desde el backend:
NSDictionary *userInfo = @{@"view": @"TabPage3"};
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter postNotificationName:@"ShowView" object:nil userInfo:userInfo];`
dentro de MainView
- (void)viewDidLoad {
[self viewDidLoad];
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self selector:@selector(showView:) name:@"ShowView" object:nil];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if(self.receivedNotification != nil){
[self showView:self.receivedNotification];
self.receivedNotification = nil;
}
}
- (void)showView:(NSNotification*)notification {
if (viewController.isViewLoaded && viewController.view.window) {
// viewController is visible
if ([notification.userInfo valueForKey:@"TabPage3"]){
[self.tabBarController setSelectedIndex:3];
}
} else {
self.receivedNotification = notification;
}
}
dentro de la página de inicio
- (void)viewDidLoad {
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self selector:@selector(showView:) name:@"ShowView" object:nil];
}
- (void)showView:(NSNotification*)notification {
if ([notification.userInfo valueForKey:@"TabPage3"]){
[self.NavigationController pushViewController:mainViewController animated:YES];
}
}
Una buena práctica es dividir su aplicación en dos partes:
El dominio : contiene todas las clases de servicio para comunicaciones remotas (es decir, si necesita alcanzar un backend distante) y todas las clases y modelos relacionados con su lógica empresarial . Esta parte es la que utiliza j2objc y desea que no esté conectada a su interfaz de usuario.
La interfaz de usuario : Todos los ViewControllers y Vistas pertenecen aquí.
¿Por qué son distintos entre sí?
Una vez que esté configurado con toda la lógica de su negocio , debería ser bueno para generar su código con j2objc y dejarlo prácticamente intacto. Su interfaz de usuario, en el otro extremo, puede cambiar mucho en la vida útil de su aplicación (recuerde que iOS 7 obligó a cada desarrollador a actualizar la apariencia de sus aplicaciones). Desea mantener las actualizaciones en el dominio o la interfaz de usuario para que no afecten a la otra parte.
Como trabajan juntos?
Después de una acción (es decir, un toque en un botón), puede preguntar al dominio si se cumplen algunos requisitos previos (es decir, ¿es un usuario nuevo?) Y luego crear una instancia de ViewController para su visualización. La IU puede proporcionar datos al dominio o solicitar algunos, pero es su responsabilidad crear instancias de View / ViewControllers.
Enrutamiento complejo
En aplicaciones en las que necesito poder navegar en algún lugar basado en una notificación remota remota o en alguna lógica compleja, tiendo a dejar que un objeto (llamado "enrutador") maneje todo esto. Sigue residiendo en la parte de la interfaz de usuario y le pasas los objetos de dominio necesarios para tomar las decisiones. A continuación, devuelve un objeto de navegación que muestra una pila de navegación (podría tratarse de un objeto que maneja una cadena similar a una URL) que podría proporcionar recursivamente a sus viewControllers.
Digamos que su objeto "enrutador" devuelve un objeto de navegación "firstVC / secondVC / thirdVC" a AppDelegate. El AppDelegate podría llamar a un método de dequeue
que devuelve "firstVC" y, en base a esta instancia, un objeto "firstViewController" para agregar en una pila de UINavigationController. Luego pasa el objeto "enrutador" a este ViewController recientemente instanciado, que también llama al método de dequeue
a recibir "secondVC". Basado en esto, "firstViewController" crearía una instancia de un objeto "secondViewController" para agregarlo a la pila de UINavigationController. Luego pasaría el mismo objeto "enrutador" a ese objeto "secondViewController", y ese otro llamaría al método de dequeue
para obtener "thirdVC" e instanciar el ViewController apropiado.
De esa manera, usted construye su pila de navegación al permitir que cada ViewController ejemplifique otro ViewController que conoce (en mi ejemplo anterior, "firstViewController" conoce sobre "secondViewController" porque su vista tiene un botón que permite al usuario alcanzar la vista de "secondViewController", pero no sabe sobre "thirdViewController").
También puede hacer que su AppDelegate compile toda la pila de navegación, pero como su "firstViewController" ya tiene el encabezado "secondViewController" importado para que el botón funcione, es mejor dejar que haga el trabajo asociado con ese ViewController, etc.
Muestra de trabajo
Aquí hay un proyecto de demostración que hice para ilustrar lo que acabo de exponer.
Las clases contenidas en la carpeta "Dominio" podrían ser sus clases generadas con j2objc. El método buildNavigationStack
en AppDelegate construye una pila de navegación funcional con un objeto ''Enrutador''. Hice de este proyecto un esqueleto simple mientras mostraba algunos patrones, como las fábricas para una instanciación de clases centralizada y organizada, y los viewData que encapsulan un objeto modelo y los datos de salida están listos para su visualización. Podría mejorarse con unos pocos protocolos para hacer las cosas un poco más abstractas, pero intenté hacerlo simple desde el punto de vista de la presentación.