ios objective-c iphone modalviewcontroller

ios - Retraso en la presentación de un controlador de vista modal



objective-c iphone (6)

Debería mostrarlo modalmente desde su raíz vc (por ejemplo: customTabBarRootViewController). guarde una referencia y use el controlador de referencia para visualizarla.

Tengo una aplicación basada en la barra de pestañas. Hay controladores de navegación en las 5 pestañas con instancias de configuración de controlador de vista personalizada correctamente como controladores de vista raíz. Esto se carga muy bien. Un par de estos controladores de vista contienen vistas de tabla. Quiero mostrar un controlador de vista modal al usuario cuando seleccionan una fila en la vista de tabla. El método de delegado didSelectRowAtIndexPath (parte relevante de) tiene el siguiente aspecto:

SampleSelectorViewController *sampleVC = [[SampleSelectorViewController alloc] init]; [self presentViewController:sampleVC animated:YES completion:NULL];

El controlador de vista modal aparece PERO aparece después de un retraso muy notable. A veces, incluso requiere que el usuario toque la fila por segunda vez. Algunas cosas que ya he verificado son:

  • El método didSelectRowAtIndexPath de la vista de tabla se llama cuando el usuario toca la fila
  • El método didSelectRowAtIndexPath no contiene ninguna llamada de bloqueo. No se están realizando operaciones de red y la configuración del controlador de vista modal no implica ninguna tarea de procesamiento intensivo. Los datos que muestra son estáticos.
  • Si presiono el nuevo controlador de vista en la pila de navegación (todo lo demás es exactamente igual), se comporta perfectamente sin demoras. Es solo cuando se presenta modalmente que se encuentra el retraso.

¿Alguna idea / sugerencia?


Parece llamar a presentViewController:animated:completion desde dentro de tableView:didSelectRowAtIndexPath: es problemático. También es difícil encontrar algo que se destaque al usar Time Profiler en los instrumentos. A veces mi vista modal aparece en menos de un segundo y otras veces toma 4s o incluso 9s.

Creo que está relacionado con el UIPresentationController subyacente y el diseño, que es una de las pocas cosas que veo cuando selecciono la región de tiempo entre hacer tapping en una fila y ver la presentación modal en Time Profiler.

Existe un radar que describe este problema: http://openradar.appspot.com/19563577

La solución es simple pero insatisfactoria: retrasar un poco la presentación para evitar cualquier comportamiento conflictivo que esté causando la desaceleración.

dispatch_async(dispatch_get_main_queue(), ^{ [self presentViewController:nav animated:YES completion:nil]; });


Solución en Swift 3

En el SampleSelectorViewController (el controlador de vista presentado) use el siguiente código

DispatchQueue.global(qos: .background).async { // Write your code }


Supongo que también establece el selectionStyle de la celda en UITableViewCellSelectionStyleNone . Cambio a UITableViewCellSelectionStyleDefault y funciona perfectamente.


Swift 4: para swift 4 puede usarlo como se muestra a continuación.

DispatchQueue.main.async { let popUpVc = Utilities.viewController(name: "TwoBtnPopUpViewController", onStoryboard: "Login") as? TwoBtnPopUpViewController self.present(popUpVc!, animated: true, completion: nil) }

Esto funciona para mi.


También he tenido este extraño retraso al presentar desde tableView:didSelectRowAtIndexPath: parece un error de Apple.

Sin embargo, esta solución parece funcionar bien.

CFRunLoopWakeUp(CFRunLoopGetCurrent()); // Fixes a bug where the main thread may be asleep, especially when using UITableViewCellSelectionStyleNone