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:
#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
Yo lo podría en el snippets EN también.
Bravo David!
Muy bueno!
:good:
Enhorabuena, eres una bocanada de aire fresco dentro del GLBasic.
Sigue así :nw:
This sounds amazing would love some info how to implement it in English please :)
OK.
I will publish it now in english, in the codesnippets section then ;)
Regards.
Quote from: DaCarSoft on 2011-Aug-08
OK.
I will publish it now in english, in the codesnippets section then ;)
Regards.
Excellent :good:
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
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.