Swift: Usando múltiples UIPresentationControllers.
Tengo una presentación modal para una tarjeta que utiliza un controlador de presentación personalizado, lo cual funciona bien. Ahora necesito utilizar un controlador de presentación para otro popup, pero la dificultad es que necesita ser diferente. Me encontré con varios problemas al intentar superar esto.
Primer problema: Obviamente, no puedo tener dos extensiones iguales en mi controlador de vista, lo que significa que solo puedo hacer referencia a un archivo de UIPresentationController según sé. Sin embargo, idealmente necesitaría un segundo UIPresentationController para gestionar la segunda presentación.
Segundo problema: Dado que no podía tener una segunda extensión, intenté utilizar una declaración “if” dentro de la extensión como tal:
extension ThirdViewControllerPassenger: UIViewControllerTransitioningDelegate {
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
if something == something {
PresentationController(presentedViewController: presented, presenting: presenting)
} else {
PresentationController2(presentedViewController: presented, presenting: presenting)
}
}
}
Eso no funcionó, supongo que porque no puedo cambiar la sintaxis de la extensión. El error fue una devolución faltante.
Tercer problema: mi última idea fue utilizar una clave de usuario predeterminada para guardar un estado y luego revisar el estado para cada función dentro de mi UIPresentationController. Por ejemplo, establecería ” defaults.set(‘showTripOverview’, forKey: ‘presentationStyle’) ” y luego dividiría mis funciones de UIPresentationController en dos partes, una si presentationStyle es “ShowTripOverview” y otra si no lo es. La idea funcionó bien, se compiló el código y parecía funcionar. Pero no fue por mucho tiempo cuando me di cuenta de que todas mis preferencias que establecí en mi controlador de vista principal (¡que debió haberse ejecutado antes de llamar al UIPresentationController!) se establecieron en nulo. Así que todas mis llamadas conditionales fueron directamente al else, lo cual no era lo que quería…
¿Alguien puede explicarme cómo resolver uno de los tres problemas? Solo necesito poder utilizar un segundo UIPresentationController de alguna manera para ajustar la animación, etc. para la segunda presentación. No pensaría que sería algo extraño de hacer, ya que muchas aplicaciones usan diferentes formas de presentar cosas. Sin embargo, no pude encontrar nada en la web…
davy.ai
Solución para utilizar múltiples UIPresentationControllers
Como experto en TI especializado en iOS, Swift, UIViewController, NSUserDefaults y UIPresentationController, puedo sugerir algunas soluciones para los tres problemas encontrados.
Primer problema: Puede crear una nueva clase conformante
UIViewControllerTransitionDelegate
para la segunda presentación con una nueva instancia deUIPresentationController
. Por lo tanto, tendrá dos controladores de presentación y dos delegados de transición.Ejemplo de la clase conformante
UIViewControllerTransitionDelegate
:Segundo problema: Puede intentar crear una función separada para devolver la instancia de
UIPresentationController
según su condición.Ejemplo:
Luego puede usarlo en sus métodos de delegado de la siguiente manera:
Tercer problema: Puede usar
UserDefaults
para guardar el estilo de presentación antes de presentar el controlador de vista y luego usar el valor guardado en su clase de controlador de presentación.Ejemplo:
Nota: asegúrese de sincronizar
UserDefaults
antes de acceder al valor guardado.Espero que estas soluciones le ayuden a superar los problemas y utilizar múltiples
UIPresentationController
.