es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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…

Tags:  , , , ,

Answer

  1. Avatar for 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 de UIPresentationController. Por lo tanto, tendrá dos controladores de presentación y dos delegados de transición.

    Ejemplo de la clase conformante UIViewControllerTransitionDelegate:

    class SecondPresentationDelegate: NSObject, UIViewControllerTransitioningDelegate {
    
        func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
            return SecondPresentationController(presentedViewController: presented, presenting: presenting)
        }
    }
    

    Segundo problema: Puede intentar crear una función separada para devolver la instancia de UIPresentationController según su condición.

    Ejemplo:

    func getPresentationController(presented: UIViewController, presenting: UIViewController?) -> UIPresentationController? {
        if algo == algo {
            return PresentationController(presentedViewController: presented, presenting: presenting)
        } else {
            return PresentationController2(presentedViewController: presented, presenting: presenting)
        }
    }
    

    Luego puede usarlo en sus métodos de delegado de la siguiente manera:

    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        // su código de controlador de animación 
    }
    
    func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        // su código de controlador de animación 
    }
    
    func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
        return getPresentationController(presented: presented, presenting: presenting)
    }
    

    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:

    // Antes de presentar su controlador de vista
    UserDefaults.standard.set("ShowTripOverview", forKey: "presentationStyle")
    
    // En su clase PresentationController 
    if let presentationStyle = UserDefaults.standard.string(forKey: "presentationStyle") {
        if presentationStyle == "ShowTripOverview" {
            // su código para la presentación ShowTripOverview 
        } else {
            // su código para otras presentaciones
        }
    }
    

    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.

Comments are closed.