2012-07-18 8 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]; 
} 

Quando si esegue questo, c'è un ritardo di alcuni secondi prima che la vista di composizione sia effettivamente visualizzata. Che cosa sta causando questo e come si fa a eliminare il ritardo?Come eliminare il ritardo nella presentazione di MFMessageComposeViewController?

MODIFICA 1: Chiarimento: l'esecuzione di sms_message_vc e ivar non è di aiuto poiché il processo ...alloc] init] interromperà l'interfaccia utente per secondi, indipendentemente da dove si trova.

EDIT 2: provato GCD (con priorità diverse) per tentare di eseguire l'inizializzazione contemporaneamente. non ha aiutato:

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

E 'Dalay troppo tempo? –

risposta

0

Considerare la MFMessageComposeViewController * sms_message_vc una variabile di istanza di una classe e chiamare:

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

in precedenza, insieme con l'impostazione del delegato al self subito dopo initing sms_message_vc

Poi basta fare :

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]; 

Quando si desidera effettivamente inviare il messaggio. Questo non dovrebbe cambiarlo troppo ma potrebbe aiutare alcuni.

+0

Provato. Il problema con questo approccio è che quando ... alloc] init] esegue il telefono si blocca solo in attesa di qualcosa. Quindi, rendendolo un ivar e inizializzando durante viewDidLoad, ad esempio, si blocca la visualizzazione fino a quando il processo ... alloc] init] non viene eseguito. –

+0

Immagino che tutto questo codice debba essere da qualche parte, forse condiviso nel Delegato app in modo che venga chiamato all'avvio? Non sono sicuro in quale altro posto puoi nasconderlo. – Eric

+0

Ho anche provato ad usare GCD per vedere se ... alloc] init] potrebbe accadere contemporaneamente inutilmente. Vedi la mia seconda modifica per i dettagli. –

0

Ho lo stesso problema. Ho provato a mettere in cache il controller in una variabile statica. Ma non ha funzionato. si comportava in modo irregolare. La prima volta funziona, il delegato della seconda volta viene chiamato automaticamente senza alcuna azione da parte dell'utente e la schermata 3a volta diventa nera. Sembra che tu debba creare l'istanza dopo ogni licenziamento!

importazione Fondazione MessageUI importazione UIKit importazione

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 
} 

}

di utilizzo,

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)") 
     } 
    } 
Problemi correlati