IBOutlet enlace al controlador de vista integrado


Tengo una vista de iPad compleja que administro al tener varios controladores de vista. Anteriormente (antes de iOS6/XCode 4.5) hice esto asignando mis controladores de vista en código, y conecté las diversas vistas a ellos a través de enlaces a la vista maestra.

Lo que me gustaría hacer es usar las nuevas vistas de contenedor para incrustar los controladores de vista en el archivo del guion gráfico. No parece ser capaz de hacer un enlace IBOutlet al controlador de vista incrustado al controlador maestro.

Es es posible hacer esto? O para recuperar el controlador incrustado a través de una etiqueta o algo en el código?

Esta pregunta es ESPECÍFICAMENTE sobre el uso de vistas de contenedores

Author: Dan F, 2012-10-01

4 answers

No estoy seguro de lo que quiere decir con "recuperar el controlador incrustado". Cuando se quiere utilizar un controlador se utiliza el método UIStoryboard Instantiateviewcontroller Withidentifier:, utilizando el identificador que se le da al controlador en IB. También puede usar el método performSegueWithIdentifier: sender: (que también creó una instancia del controlador de vista). Deberías consultar la sección" Uso de View Controllers en tu App " en los documentos de Apple. También hace referencia al hecho de que la opinión del niño los controladores se instancian al mismo tiempo que el controlador del contenedor.

Después de editar: Si inserta una vista contenedor en otro controlador de vista, se puede hacer referencia al controlador de esa vista incrustada desde el controlador contenedor con self.Childviewcontroller (que será una matriz, por lo que si solo hay uno, puede obtenerlo con lastObject).

 20
Author: rdelmar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-01 18:53:15

Otra opción para algunos casos es capturar el controlador incrustado usando -prepareForSegue:sender:.

Por ejemplo, si tengo un UINavigationController incrustado dentro de un CustomContainerViewController, puedo nombrar el segue embed embedContentStack en el guion gráfico y capturarlo en CustomContainerViewController a través de

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"embedContentStack"]) {
        // can't assign the view controller from an embed segue via the storyboard, so capture here
        _contentStack = (UINavigationController *)segue.destinationViewController;
    }
}
 65
Author: PlayfulGeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-11 19:34:03

Aquí hay otro hilo al respecto: Controlador de Vista de contenedor de acceso desde iOS padre

Proponen mantener una referencia en prepareForSegue o buscar el controlador ViewController incrustado en self.Childviewcontroller

 2
Author: theguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:09:51

Nota de precaución

Antes de proceder a utilizar una respuesta a esta pregunta, es posible que desee reflejar si las cosas incrustadas realmente necesitan ser controladores de vista.

Por ejemplo, si está incrustando una subclase UICollectionViewController, ¿podría incrustar una subclase UICollectionView? O, mejor aún, ¿podría incrustar una subclase UIView que oculta el UICollectionView detrás de un simple ViewModel?

En la base de código en la que estoy trabajando actualmente, estoy incrustando dos controladores de vista en otra vista controlador. Ambos podrían ser vistas simples con bastante facilidad, y luego podrían vincularse más fácilmente en el guion gráfico, sin este código desordenado.

Desafortunadamente, actualmente son controladores de vista y no estoy en condiciones de simplificarlos en vistas simples en este momento, por lo que esto tendrá que hacer.

Antecedentes

Estoy usando el enfoque de recoger el segue incrustado en prepare(for segue:, sender:) como sugiere Geek Juguetón aquí.

Quería mostrarle al swift que soy usando para esto, ya que parece ser bastante ordenado {

class EditionLandingViewController: UIViewController {
    fileprivate var titlesView: SectionTitlesViewController!
    fileprivate var sectionsView: SectionsViewController!
}

//MARK:-

extension EditionLandingViewController {
    private enum SegueId: String {
        case embedTitles
        case embedSections
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        super.prepare(for: segue, sender: sender)

        guard
            let segueRawId = segue.identifier,
            let segueId = SegueId(rawValue: segueRawId)
            else { return }

        switch segueId {
        case .embedTitles:
            self.titlesView = segue.destination as! SectionTitlesViewController

        case .embedSections:
            self.sectionsView = segue.destination as! SectionsViewController
        }
    }
}

Discusión

He elegido nombrar segues como métodos de acción.

Usar un enum casos para identificadores de segue significa que tienes el compilador y las herramientas de tu lado, por lo que es mucho más difícil obtener un nombre de segue incorrecto.

Mantener los id de segue en un private enum dentro del ámbito extension parece apropiado en este caso, ya que estos segues no son necesarios en ningún otro lugar (no pueden ser performed, para ejemplo).

Estoy usando tipos implícitamente sin envolver para los controladores de vista incrustados porque (en mi caso de todos modos) es un error lógico si faltan.

Del mismo modo, también estoy feliz de forzar los tipos de controlador de vista de destino. Una vez más, sería un error lógico si estos tipos no son los mismos.

 0
Author: Benjohn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-25 07:59:03