iphone cómo - El teclado muestra y luego se oculta inmediatamente al mostrar MFMessageComposeViewController




no 10 (5)

Estoy construyendo una aplicación PhoneGap usando Cordova 2.2 para IOS. Estoy experimentando un comportamiento extraño al llamar a un complemento obj-c nativo que he escrito para mostrar el MFMessageComposeViewController.

La configuración es muy simple: tengo un evento tap asociado a un elemento UI, que cuando se presiona, hace una llamada a mi complemento PhoneGap, pasa un número y un mensaje de texto, luego muestra el MFMessageComposeViewController con los parámetros pre-poblados .

Mi javascript se ve así:

$(document).bind('deviceready', function(){ 

    $(".theButton").tap(function(){     

        cordova.exec(function(){}, function() {}, "PhoneGapSms", "SendSms", [db.getItem("profile_sms"), db.getItem("profile_emergency")]);

    }); 
});

Y mi código obj-c se ve así:

- (void)SendSms:(CDVInvokedUrlCommand*)command
{

    CDVInvokedUrlCommand* myCommand = command;

    MFMessageComposeViewController *picker = [[MFMessageComposeViewController alloc] init];

    NSString* body = [command.arguments objectAtIndex:0];
    NSString* toRecipientsString = [command.arguments objectAtIndex:1];

        if(body != nil)
            picker.body = body;

        if(toRecipientsString != nil)
            [picker setRecipients:[ toRecipientsString componentsSeparatedByString:@","]];


    picker.messageComposeDelegate = self;

    [self.viewController presentModalViewController:picker animated:YES];
    [[UIApplication sharedApplication] setStatusBarHidden:YES];


    [picker release];

}

Entonces, en general, cosas muy simples.

Mi problema es esto:

Cuando mi iPhone está conectado a mi Mac y la aplicación se ejecuta desde XCode , la superposición de Message Composer aparece genial, con mis valores rellenos previamente. La siguiente imagen que muestra la interfaz de SMS aparece bien mientras está conectado a XCode:

Cuando mi iPhone se desenchufa de mi Mac, y la aplicación se ejecuta desde la plataforma de resorte , la cubierta se desliza hacia arriba, el teclado comienza a deslizarse hacia arriba y luego se desliza hacia abajo , lo que hace imposible escribir o enviar el mensaje. Esto es lo que parece cuando no está conectado a Mac / Xcode: el teclado comienza a deslizarse hacia arriba y luego se desliza hacia abajo (~ <seg) dejando la siguiente interfaz:

No puedo, por mi propia vida, descubrir qué podría causar que el teclado se oculte cuando no se ejecuta desde XCode, pero funciona perfectamente cuando es así.

¿Hay alguna manera de 'forzar' que el teclado se muestre, o posiblemente poner todo el modalviewcontroller como primer respondedor de alguna forma o forma?

¡Cualquier sugerencia es apreciada!

Editar:

El teclado aparecerá de nuevo si hace clic en el área de contacto


Answers

Primero : El culpable más probable, sin ver su código, es que su controlador de vista padre (que presenta) puede tener una acción en su vista viewWillDisappear o viewDidDisappear que muestra quién tiene el "primer" respondedor. Se llama a estos métodos cuando se presenta un controlador de vista de manera modal. Puede que se comporte de manera diferente en el simulador que en el dispositivo debido a la sincronización: a menudo, las condiciones de temporización realmente cercanas son diferentes en el dispositivo ARM y en el procesador i386.

Segundo : ¿Se registra en UIKeyboardWillShowNotification parte de tu aplicación el UIKeyboardWillShowNotification o el UIKeyboardDidShowNotification ? Si es así, coloque los puntos de corte en los métodos que se llaman como resultado; es posible que algún otro controlador en su jerarquía de vista esté interfiriendo con este.

Para responder tu pregunta...

¿Hay alguna manera de 'forzar' que el teclado se muestre, o posiblemente poner todo el modalviewcontroller como primer respondedor de alguna forma o forma?

No a ambos. La única forma de mostrar el teclado es llamar al método becomeFirstResponder de la vista de entrada. Como Apple no expone la vista de texto, no puede enviar mensajes. Configurar el modalViewController como primera respuesta sería establecer el objeto equivocado.



Encontré estos síntomas con una instalación Sencha Touch 2.2 y Cordova 2.6.0 (específicamente, dispositivos iOS 6+).

El problema era que el marco web robaba el enfoque del modo nativo de SMS Composer, que se produce normalmente después de que se haya mostrado y cerrado correctamente el primer modalizador de SMS Composer.

Una event.preventDefault() y event.stopPropagation() una vez que el evento haya sido disparado (o event.stopEvent() en tierra Sencha) resolvió esto.

Espero que esto ayude,

-James


Debe agregar MessageUI.framework a su proyecto de Xcode e incluir un

#import <MessageUI/MessageUI.h> en su archivo de encabezado.

prueba este código puede ser útil para ti ..

[self presentModalViewController:picker animated:YES];
//[self becomeFirstResponder];//try picker also instead of self

También consulte este tutorial a continuación y también verifique la demostración.

  1. new-tutorial-developing-and-architecting-a-phonegap-application

  2. SMSComposer

Espero que esto te ayude...


Respuesta corta y pragmática: Cambiar UITableViewRowAnimationAutomatic a UITableViewRowAnimationTop resuelve el problema. ¡No más filas que desaparecen! (probado en iOS 5.1)

Otra respuesta breve y pragmática, ya que se dice que UITableViewRowAnimationTop causa sus propios problemas: crear una nueva vista de celda en lugar de modificar el marco existente. En una aplicación real, los datos que se muestran en la vista de celda se supone que deben estar en la parte del Modelo de la aplicación de todos modos, por lo que, si se diseñan correctamente, no debería ser un problema crear otra vista de celda que muestre los mismos datos de manera diferente. (marco en nuestro caso).

Algunos pensamientos más con respecto a animar la recarga de la misma celda:

UITableViewRowAnimationAutomatic parece resolverse en UITableViewRowAnimationFade en algunos casos, que es cuando ves que las células se desvanecen y desaparecen. Se supone que la nueva celda se desvanecerá mientras que la vieja se desvanecerá. Pero aquí la celda vieja y la nueva son una y la misma. Entonces, ¿podría esto funcionar? En el nivel Core Animation, ¿es posible desvanecer una vista Y desvanecerla al mismo tiempo? Suena dudoso. Así que el resultado es que simplemente ves que se desvanece. Esto podría considerarse un error de Apple, ya que un comportamiento esperado podría ser que si la misma vista ha cambiado, la propiedad alfa no se animaría (ya que no se puede animar tanto a 0 como a 1 al mismo tiempo), pero en su lugar, solo se animaría el marco, el color, etc.

Tenga en cuenta que el problema está solo en la pantalla de la animación: si se aleja y retrocede, todo aparecerá correctamente.

En iOS 4.3, el modo Automatic podría haberse resuelto en algo distinto a Fade por eso las cosas funcionan allí (como escribes). No me interesé por eso.

No sé por qué iOS elige el modo Fade cuando lo hace. Pero uno de los casos que lo hace es cuando su código pide que se vuelva a cargar una celda previamente tocada, que está colapsada, y es diferente a la celda tocada en ese momento. Tenga en cuenta que la celda tocada anteriormente siempre se vuelve a cargar, esta línea en su código siempre se llama:

[indicesToReload addObject:[previousIndexPath_ copy]];

Esto explica el escenario mágico de células desaparecidas que has descrito.

Por cierto, las actualizaciones de inicio / finalización parecen un truco para mí. Se supone que este par de llamadas solo contiene animaciones, y no hay ninguna animación que agregue además de las filas que ya pidió que recargue. Todo lo que hizo en este caso es que el modo Automatic no eligiera Fade en algunos casos, pero esto simplemente ocultó el problema.

Una nota final: jugué un poco con el modo Top y descubrí que también puede causar problemas. Por ejemplo, al insertar el siguiente código, las celdas desaparecen de forma extraña:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop];
}

No estoy seguro de si hay un problema real aquí (similar al de la aparición y desaparición de una vista al mismo tiempo), o tal vez un error de Apple.





iphone objective-c ios xcode cordova