|
|
|
|
- Presentación
- Crear un proyecto Catalyst con WINDEV Mobile
- Desarrollar una aplicación Catalyst con WINDEV Mobile
- Funciones específicas para el modo asíncrono
- Ejemplo simple de adaptación de código en modo asíncrono
- Ejemplo complejo de adaptación de código en modo asíncrono
MacOS - Desarrollar una aplicación en modo Catalyst
Apple lanzó recientemente un SDK para compilar aplicaciones iOS para MacOS de forma nativa. WINDEV Mobile ha evolucionado para permitirle aprovechar estas nuevas funcionalidades. Una aplicación Catalyst se desarrolla en varias etapas: Esta página de ayuda presenta las etapas para crear y desarrollar un proyecto MacOS. El proyecto se genera y compila de la misma manera que una aplicación estándar de iOS. Crear un proyecto Catalyst con WINDEV Mobile Para crear un proyecto que pueda ser compilado para MacOS con WINDEV Mobile: - Cree un proyecto para iOS (para obtener más información, consulte Desarrollar una aplicación para iPhone/iPad).
- Abra la ventana de descripción de la configuración actual: en la pestaña "Proyecto", en el grupo "Configuración del proyecto", haga clic en "Configuración actual".
- En la pestaña "General", seleccione la opción "Permitir que la aplicación se ejecute en macOS Catalina o posterior (Mac Catalyst)".
- Valide.
Desarrollar una aplicación Catalyst con WINDEV Mobile Una aplicación que puede ser compilada para MacOS se desarrolla de manera similar a una aplicación estándar. Sin embargo, aparecen nuevas limitaciones. La principal limitación es la desaparición del modo síncrono. La aplicación no tiene permisos para bloquear la interfaz del usuario: - no hay procesos largos en el subproceso principal,
- no hay mensajes de información o de errores,
- ...
Funciones específicas para el modo asíncrono WLanguage propone funciones específicas para mostrar información al usuario:
| | ConfirmAsynchronous | Muestra un mensaje no bloqueante en un cuadro de diálogo estándar con las respuestas "Sí", "No", "Cancelar" y llama a un procedimiento WLanguage con la respuesta del usuario. | DialogAsynchronous | Muestra un cuadro de mensaje no bloqueante y llama a un procedimiento WLanguage con el valor del botón pulsado por el usuario. | ErrorAsynchronous | Muestra un mensaje de error personalizado en una ventana de error del sistema no bloqueante. | ErrorWithTimeoutAsynchronous | Muestra un mensaje de error personalizado en una ventana de error del sistema no bloqueante durante un tiempo determinado. | InfoAsynchronous | Muestra un mensaje personalizado no bloqueante en una ventana de información del sistema. | InfoWithTimeoutAsynchronous | Muestra un mensaje personalizado en una ventana de información del sistema no bloqueante durante un tiempo determinado. | OKCancelAsynchronous | Muestra un mensaje en un cuadro de diálogo estándar no bloqueante que propone las respuestas "OK" y "Cancelar" y llama a un procedimiento WLanguage con la respuesta del usuario. | WarningAsynchronous | Muestra un mensaje personalizado en una ventana de advertencia del sistema no bloqueante. | YesNoAsynchronous | Muestra un mensaje en un cuadro de diálogo estándar no bloqueante con las respuestas "Sí" y "No" y llama a un procedimiento WLanguage con la respuesta del usuario. |
Como su nombre lo indica, estas funciones son asíncronas: no bloquean el código. Por lo tanto, el código que sigue a estas funciones se ejecuta directamente, aunque el usuario no haya validado el cuadro de información. Esto significa que es necesario adaptar el código para obtener un comportamiento consistente. - el texto a mostrar (a diferencia de las funciones Error e Info, este texto debe ser una sola cadena),
- un procedimiento al que se llamará cuando el usuario valide el mensaje.
Ejemplo simple de adaptación de código en modo asíncrono Para entender cómo adaptar el código en modo asíncrono, veamos un caso simple de verificación de entrada: // Checks the name IF EDT_Name ~= "" THEN // Displays a message to the user Error("You must enter a name") // Force input in the control SetFocus(EDT_Name) // Stop the code RETURN END
En el modo asíncrono, se deberá adaptar este código de la siguiente manera: // Checks the name IF EDT_Name ~= "" THEN // Displays a message to the user // The cbErrorName procedure will be run when the error is validated ErrorAsynchronous("You must enter a name", cbErrorName) // Stop the code RETURN END INTERNAL PROCEDURE cbErrorName() // Set focus on the control SetFocus(sControlName) END
Observación: para un código más conciso, se pueden utilizar procedimientos Lambda en lugar de procedimientos internos. // Checks the name IF EDT_Name ~= "" THEN // Displays a message to the user // SetFocus will be run when the error is validated ErrorAsynchronous("You must enter a name.", () => { SetFocus(EDT_Name) } ) // Stop the code RETURN END
Ejemplo complejo de adaptación de código en modo asíncrono En un control Looper, se puede definir que el gesto de eliminación se gestione automáticamente: - Vaya a la pestaña "Detalles" de la ventana de descripción del control.
- En la opción "Deslizar una fila", seleccione "Eliminación automática".
- Valide. Los siguientes eventos se asocian al control automáticamente: "Antes de eliminar automáticamente una fila", "Después de eliminar automáticamente una fila", "Deslizamiento de una fila".
En el evento "Antes de eliminar automáticamente una fila", se puede cancelar la eliminación de la fila, por ejemplo después de solicitar una confirmación del usuario. Utilice la instrucción "RETURN False" para anular el evento. El siguiente código muestra un ejemplo en el evento "Antes de eliminar automáticamente una fila": // Asks confirmation to the user IF YesNo("Delete contact?") = Yes THEN // Deletes the row RETURN True END // Cancel deletion RESULT False
En el modo asíncrono, se deberá adaptar este código utilizando la función WLanguage asíncrona correspondiente. Dado que la confirmación no es bloqueante, se puede cancelar la eliminación de forma predeterminada. La eliminación se tiene en cuenta realmente cuando el usuario responde al cuadro de diálogo. // Asks confirmation to the user YesNoAsynchronous ("Delete contact?", _cbDeletion) // Cancel deletion: // the deletion will only be done if the user selects "Yes" RESULT False INTERNAL PROCEDURE _cbDeletion(nResponse) // If the user selects "Yes" IF nResponse = Yes THEN // Delete the desired row LooperDelete(LOOP_Contacts) END END Una vez que se desarrolla la aplicación para MacOS, se debe generar la aplicación para iOS y, al igual que las aplicaciones iOS, se debe pasar a un Mac para compilar el proyecto Xcode: - Haga clic en en los botones de acceso rápido.
- Si es necesario, seleccione la primera ventana que aparece en las diferentes plataformas (iPhone, iPad y Apple Watch).
- El asistente de generación se abre. Para obtener más información sobre la generación de proyectos en Xcode, consulte Generación de la aplicación.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|