2012-07-18 14 views
5
if([MFMessageComposeViewController canSendText]) 
{ 
    MFMessageComposeViewController *sms_message_vc = [[MFMessageComposeViewController alloc] init]; 
    sms_message_vc.body = text; 
    sms_message_vc.recipients = recipients; 
    sms_message_vc.messageComposeDelegate = self; 
    [self presentModalViewController:sms_message_vc animated:FALSE]; 
    [[UIApplication sharedApplication] setStatusBarHidden:TRUE]; 
    [sms_message_vc release]; 
} 

Cuando esto se ejecuta, hay un retraso de varios segundos antes de que realmente se muestre la vista de composición. ¿Qué está causando esto y cómo se hace para eliminar el retraso?¿Cómo eliminar el retraso en la presentación de MFMessageComposeViewController?

EDIT 1: Aclaración: Hacer sms_message_vc e ivar no ayuda porque el proceso ...alloc] init] colgará la IU durante unos segundos, independientemente de dónde se encuentre.

EDIT 2: Intenté GCD (con diferentes prioridades) para intentar ejecutar la inicialización al mismo tiempo. No ayudó:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, (unsigned long)NULL), ^(void){ 
    sms_message_vc = [[MFMessageComposeViewController alloc] init]; 
    sms_message_vc.messageComposeDelegate = self; 
}); 
+0

¿Es Dalay demasiado tiempo? –

Respuesta

0

Considere hacer MFMessageComposeViewController * sms_message_vc una variable de instancia de clase y llamando:

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

anterior, junto con el establecimiento del delegado a self justo después Initing sms_message_vc

A continuación, sólo lo hacen :

sms_message_vc.body = text; 
sms_message_vc.recipients = recipients; 
[self presentModalViewController:sms_message_vc animated:FALSE]; 
[[UIApplication sharedApplication] setStatusBarHidden:TRUE]; 
[sms_message_vc release]; 

Cuando realmente quiere enviar el mensaje. Esto no debería cambiarlo demasiado, pero podría ayudar a algunos.

+0

Lo intenté. El problema con ese enfoque es que cuando ... alloc] init] ejecuta el teléfono simplemente se cuelga esperando algo. Por lo tanto, convertirlo en un ivar e inicializar durante viewDidLoad, como ejemplo, hace que su vista se cuelgue hasta que se lleve a cabo el proceso ... alloc] init]. –

+0

Supongo que todo este código tiene que estar en algún lugar, tal vez compartido en el delegado de la aplicación, ¿así que se llama al inicio? No estoy seguro de dónde más puedes esconderlo. – Eric

+0

Incluso traté de usar GCD para ver si ... alloc] init] podría suceder al mismo tiempo en vano. Ver mi segunda edición para más detalles. –

0

Tengo el mismo problema. Intenté almacenar en caché el controlador en una variable estática. Pero no funcionó. se comportó erráticamente. La primera vez funciona, la segunda vez que se llama al delegado sin ninguna acción del usuario y la pantalla de la 3era vez se pone negra. ¡Parece que tienes que crear la instancia después de cada despedida!

Fundación importación MessageUI importación UIKit importación

class UIUtil { 

static var messageController:MFMessageComposeViewController? = nil 
static var checkedOnce = false 

class func createMessageController() -> MFMessageComposeViewController? { 
    if checkedOnce { 
     return messageController 
    } 
    checkedOnce = true 
    if (MFMessageComposeViewController.canSendText()) { 
     messageController = MFMessageComposeViewController() 
     messageController?.recipients = [SettingsManager.shared.switchPhoneNumber] 
    } else { 
     print("SMS services are not available in this device.") 
    } 
    return messageController 
} 

} Usos

,

func createSMSView (text:String) { 
     print("Sending SMS to \(SettingsManager.shared.switchPhoneNumber). Text: \(text)") 
     if let ctr = UIUtil.createMessageController() { 
      ctr.body = text 
      ctr.messageComposeDelegate = self 
      self.present(ctr, animated: true, completion: nil) 
     } else { 
      print("Could not send SMS. Text: \(text)") 
     } 
    } 
Cuestiones relacionadas