CODESNIPPET: GLBasicWebBoxer ;)

Previous topic - Next topic

DaCarSoft

Buenas...

Aquí os dejo otro Wrapper de los míos, esta vez para mostrar una pequeña web dentro de un alert   :P

Ya que alguién (OMADAN) pidió algo así en un post, he decidido mostrados cómo hacerlo, intentando además hacerlo bonito redondeando el borde del control Web y demás...   PROBADLO bien, repitiendo la muestra de la "pequeña" web varias veces repetidas, porque lo he hecho muy rápido, la verdad...   y no me ha dado tiempo a probarlo del todo.

CUIDADO: Tengo mis dudas acerca de que Apple admita esto cuando revisen la App, en principio no hay nada de código ilegal, pero nunca se sabe si Apple podría decidir que esto es una aberración muy retorcida del uso de sus "UIAlerts"    XDDDDDDD

OS PIDO UN FAVOR, que alguien coloque aquí una captura de pantalla del resultado, ya que a mí tampoco me ha dado tiempo...

Os recuerdo que el siguiente código hay que colocarlo en un archivo con extensión ".mm" que arrastréis hasta vuestro proyecto en XCode generado por GLBasic:

Code (glbasic) Select

#if defined (TARGET_OS_IPHONE)

// UIWEBALERT

//#import <UIKit/UIAlert.h>    // No es necesario duplicar la importación hecha con anterioridad
#import <QuartzCore/QuartzCore.h>    // Importamos las librerías necesarias para el redondeo de esquinas

@interface GLBasicWebBoxer: NSObject <UIAlertViewDelegate>
{
    // Declaración de los punteros para los elementos comunes
    NSString* resValues;
    NSString* pTitle,* pURL,* pButtons;
}
@end

@implementation GLBasicWebBoxer

// Llamada necesaria para llamar al código que muestra el Alert en el proceso principal
- (void)showWebAlertCaller:(NSString*)cTitle andURL:(NSString*)cURL andButtons:(NSString*)cButtons
{
    // Introducción de los valores pasados como parámetro en los punteros accesibles por "showAlert"
    pTitle = [[NSString alloc] initWithString:cTitle];
    pURL = [[NSString alloc] initWithString:cURL];
    pButtons = [[NSString alloc] initWithString:cButtons];
    // Llamada a "showWebAlert" enviándola al proceso principal
    [self performSelectorOnMainThread:@selector(showWebAlert) withObject:nil waitUntilDone:NO];
}

- (void)showWebAlert
{
// Creación de la vista para el Alert
    UIAlertView* alert = [[UIAlertView alloc] init];
alert.title = pTitle;
alert.message = @"\n\n\n\n\n\n\n\n\n\n\n\n";
alert.delegate = self;
    // Anulación de la asignación de la función de cancelar al botón con índice 0
    alert.cancelButtonIndex = -1;
// Creación de la matriz de botones introduciendo valores según los parámetros pasados separados por "|"
NSArray* aButtons = [pButtons componentsSeparatedByString:@"|"];
    // Creación de cada botón a partir de cada valor de la matriz
for (NSString* iObject in aButtons){
[alert addButtonWithTitle:iObject];
}
   
// Creación del control web ajustado a la vista del alert
UIWebView* webview = [[UIWebView alloc] initWithFrame:CGRectMake(10, 40, 264, 254)];
    webview.scalesPageToFit = YES;
    // Redondeo de esquinas usando la propiedad CALayer
    [[webview layer] setCornerRadius:10];
    [webview setClipsToBounds:YES];
    // Creamos un borde coloreado para el control
    [[webview layer] setBorderColor:
     [[UIColor colorWithRed:0.00 green:0.00 blue:0.00 alpha:1] CGColor]];
    [[webview layer] setBorderWidth:1.00];
   
    // Agregamos el control a la vista
    [alert addSubview:webview];
    [webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:pURL]]];
    [webview release];
    webview = nil;



[alert show];
[alert release];
}

// Recogida del botón pulsado en la memoria mediante la propiedad "delegate" (= self) asignada en "showAlert"
- (void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
resValues = [[NSString alloc] initWithFormat:@"%d", buttonIndex];
}

// Código que obtiene y trata los valores para construir el resultado
- (void)getValues
{
    // Creación de un puntero "NSData" temporal para albergar los valores obtenidos transformados para evitar errores por "encodings"
    NSData* tmpValuesEncoded = [[NSData alloc] init];
    // Conversión de la cadena obtenida a un "encoding" Windows Latin obviando los caracteres no reconocidos mediante "allowLossyConversion"
    tmpValuesEncoded = [resValues dataUsingEncoding:NSWindowsCP1252StringEncoding allowLossyConversion:YES];
    // Reintroducción de la cadena final convertida al "encoding" adecuado para que pueda devolverse desde "getValuesCaller"
    resValues = [[NSString alloc] initWithData:tmpValuesEncoded encoding:NSWindowsCP1252StringEncoding];
    // Liberar la memoria
    tmpValuesEncoded = nil;
}

// Obtención de los valores del botón pulsado y texto introducido en los controles recuperando los valores desde el proceso principal
- (const char*)getValuesCaller
{
    // Comprobación de si se ha pulsado un botón del Alert
    if (resValues != nil){
        // Llamada a "getValues" en el proceso principal
        [self performSelectorOnMainThread:@selector(getValues) withObject:nil waitUntilDone:YES];
        // Devolvemos el valor de la cadena preparada desde "getValues"
        return [resValues cStringUsingEncoding:NSWindowsCP1252StringEncoding];
        // Liberar la memoria
        [resValues release];
        resValues = nil;
        [pTitle release];
        pTitle = nil;
        [pURL release];
        pURL = nil;
        [pButtons release];
        pButtons = nil;
        [self release];
        [super dealloc];
    }
    else
    {
        // Si no se ha pulsado ningún botón se devuelve una cadena vacía
        return "";
    }
}

@end

// Creación del puntero para las funciones contenidas en "GLBasicMessageBoxer" a usar cada vez que se requiera un Alert
GLBasicWebBoxer* newWebAlert;



// Creación de función "externalizada" a usar desde GLBasic (el parámetro "buttons" pueden contener varios valores separados con "|")
extern "C" void iOSWebBox(const char* cTitle, const char* cURL, const char* cButtons)
{
newWebAlert = [[GLBasicWebBoxer alloc] init];
    // Conversión de tipos "C" a "NSString" al recuperar los parámetros enviados desde GLBasic y lanzado del Alert
[newWebAlert showWebAlertCaller:[NSString stringWithCString:cTitle encoding:NSASCIIStringEncoding] andURL:[NSString stringWithCString:cURL encoding:NSASCIIStringEncoding] andButtons:[NSString stringWithCString:cButtons encoding:NSASCIIStringEncoding]];
}

// Creación de la función "externalizada" a usar desde GLBasic
extern "C" const char* GetiOSWebBoxValues()
{
    // Se recupera el índice del botón pulsado
return [newWebAlert getValuesCaller];
}

// FIN UIWEBALERT

#endif



Ahora vamos con el código GLBasic:

Quote

GLOBAL BOTONPULSADOWEBBOXER$
   
IMPORT "C" void iOSWebBox(const char*, const char*, const char*)
   
IMPORT "C" const char* GetiOSWebBoxValues()

GOSUB WebBox_iOS

PRINT BOTONPULSADOWEBBOXER$, 50, 100, TRUE

// Aquí podemos colocar una sentencia IF para analizar cual de los botones se ha pulsado, y decidir si (por ejemplo) llamar a NETWEBEND

SHOWSCREEN
   
SUB WebBox_iOS:

   iOSWebBox("Título","http://www.glbasic.com","Aceptar|Cancelar")
   
   LOCAL InstanteComienzo% = GETTIMERALL()

   BOTONPULSADOWEBBOXER$ = ""
   WHILE BOTONPULSADOWEBBOXER$ = ""
      SLEEP 500
      WHILE ABS(GETTIMERALL() - InstanteComienzo%) < 500
         HIBERNATE
      WEND

      BOTONPULSADOWEBBOXER$ = GetiOSWebBoxValues()
   WEND

ENDSUB



Si alguien tiene alguna duda que me lo comente y si es necesario se lo explico más despacio  ;D


"Si quieres resultados distintos... no hagas siempre lo mismo" - Albert Einstein.

Hark0

Yo lo podría en el snippets EN también.

Bravo David!

Muy bueno!
:good:
http://litiopixel.blogspot.com
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica Development Indie Videogames · Pixel-Art · Retrocomputing · Electronic

msx

Enhorabuena, eres una bocanada de aire fresco dentro del GLBasic.

Sigue así  :nw:

spicypixel

This sounds amazing would love some info how to implement it in English please :)
http://www.spicypixel.net | http://www.facebook.com/SpicyPixel.NET

Comps Owned - ZX.81, ZX.48K, ZX.128K+2, Vic20, C64, Atari-ST, A500.600.1200, PC, Apple Mini-Mac.

DaCarSoft

OK.

I will publish it now in english, in the codesnippets section then ;)

Regards.
"Si quieres resultados distintos... no hagas siempre lo mismo" - Albert Einstein.

spicypixel

Quote from: DaCarSoft on 2011-Aug-08
OK.

I will publish it now in english, in the codesnippets section then ;)

Regards.

Excellent  :good:
http://www.spicypixel.net | http://www.facebook.com/SpicyPixel.NET

Comps Owned - ZX.81, ZX.48K, ZX.128K+2, Vic20, C64, Atari-ST, A500.600.1200, PC, Apple Mini-Mac.

DaCarSoft

I corrected a typo:

#if defined (TARGET_OS_IPHONE) // was missing...

#endif // was missing...


He corregido un error, se me olvidaba poner el #if defined (TARGET_OS_IPHONE) al principio y el #endif al final para quien no tuviera ya un archivo .mm
"Si quieres resultados distintos... no hagas siempre lo mismo" - Albert Einstein.

mentalthink

guapo, guapo, a ver si puedo probarlo esté fin de semana.

Gracias por poner los comentarios del código en Castellano, al menos a mi me ayuda un poco a entender la comlejidad del Objective C, gracias de antemano.