iphone - example - lifecycle viewcontroller ios
Cómo agregar una vista de UIViewController como subvista (7)
¡Nota para los googlers, este QA ahora está seis años desactualizado !
Como Micky a continuación y otros mencionan, esto ahora se hace de forma cotidiana con Contenedores en iOS.
Tengo un ViewController que controla muchas subvistas. Cuando hago clic en uno de los botones, inicializo otro viewcontroller y muestro su vista como subvista de esta vista. Sin embargo, la subvista excede los límites del marco para la subvista y, de hecho, llena toda la pantalla.
¿Qué podría estar mal? Supongo que el problema es que la vista de UIViewController tiene un marco (0,0,320,460) y, por lo tanto, llena toda la pantalla (aunque recibe eventos táctiles solo cuando se toca dentro de los límites del marco de la subvista). ¿Cómo puedo cambiar el tamaño del marco para que se ajuste como subvista?
En resumen, necesito ayuda para agregar la vista de un viewcontroller como subvista a la vista de otro viewcontroller.
¡Gracias!
Cambie el tamaño del marco de viewcontroller.view.frame
y luego agréguelo a la subvista. [viewcontrollerparent.view addSubview:viewcontroller.view]
Debe establecer las propiedades de los límites para que se ajusten a ese marco. enmarcar sus propiedades de superview, y los límites limitan el marco en el propio sistema de coordenadas de la vista.
Gracias a estos muchachos lo hice http://highoncoding.com/Articles/848_Creating_iPad_Dashboard_Using_UIViewController_Containment.aspx
Agregue UIView, conéctelo al encabezado:
@property (weak, nonatomic) IBOutlet UIView *addViewToAddPlot;
En - (void) viewDidLoad hacer esto:
ViewControllerToAdd *nonSystemsController = [[ViewControllerToAdd alloc] initWithNibName:@"ViewControllerToAdd" bundle:nil];
nonSystemsController.view.frame = self.addViewToAddPlot.bounds;
[self.addViewToAddPlot addSubview:nonSystemsController.view];
[self addChildViewController:nonSystemsController];
[nonSystemsController didMoveToParentViewController:self];
Disfrutar
Siento que todas estas respuestas son un poco incompletas, así que esta es la manera correcta de agregar la vista de viewController como una subvista de otra viewController''s view:
[self addChildViewController:viewControllerToAdd];
[self.view addSubview:viewControllerToAdd.view];
[viewControllerToAdd didMoveToParentViewController:self];
Si lo desea, puede copiar esto en su código como un fragmento. SO no parece entender el formato de reemplazo de código, pero aparecerán limpios en Xcode:
[self addChildViewController:<#viewControllerToAdd#>];
[self.view addSubview:<#viewControllerToAdd#>.view];
[<#viewControllerToAdd#> didMoveToParentViewController:self];
willMove se llama automáticamente con addChild. Gracias @iOSSergey
Cuando el contenedor personalizado llama al método addChildViewController: llama automáticamente al método willMoveToParentViewController: del controlador de vista para agregarlo como elemento secundario antes de agregarlo.
Utilizar:
[self.view addSubview:obj.view];
A partir de iOS 5 , Apple ahora le permite crear contenedores personalizados con el fin de agregar un UIViewController a otro UIViewController, particularmente a través de métodos como addChildViewController por lo que es posible anidar UIViewControllers
EDITAR: Incluye un resumen in situ para evitar la rotura del enlace
Yo cito:
iOS proporciona muchos contenedores estándar para ayudarlo a organizar sus aplicaciones. Sin embargo, a veces es necesario crear un flujo de trabajo personalizado que no coincida con el proporcionado por cualquiera de los contenedores del sistema. Quizás en su visión, su aplicación necesita una organización específica de controladores de vista infantil con gestos de navegación especializados o transiciones de animación entre ellos. Para hacer eso, implementa un contenedor personalizado : cuéntame más ...
...y:
Cuando diseña un contenedor, crea relaciones padre-hijo explícitas entre su contenedor, el padre y otros controladores de vista, sus hijos . Cuénteme más.
Ejemplo (cortesía de los documentos de Apple) Agregar vista de controlador de otra vista a la jerarquía de vista del contenedor
- (void) displayContentController: (UIViewController*) content
{
[self addChildViewController:content];
content.view.frame = [self frameForContentController];
[self.view addSubview:self.currentClientView];
[content didMoveToParentViewController:self];
}
Aclamaciones,
Micky Duncan
Esta respuesta es correcta para las versiones anteriores de iOS, pero ahora está obsoleta. Debería usar la respuesta de Micky Duncan, que cubre contenedores personalizados.
No hagas esto! La intención del UIViewController
es conducir toda la pantalla. Simplemente no es apropiado para esto, y realmente no agrega todo lo que necesita.
Todo lo que necesita es un objeto que posea su vista personalizada. Solo use una subclase de UIView
, para que pueda agregarse a su jerarquía de ventanas y la administración de la memoria sea completamente automática.
Indique a la subvista el propietario del NIB una subclase personalizada de UIView
. Agregue una salida contentView
a esta subclase personalizada, y contentView
a la vista dentro de la punta. En la subclase personalizada, haga algo como esto:
- (id)initWithFrame: (CGRect)inFrame;
{
if ( (self = [super initWithFrame: inFrame]) ) {
[[NSBundle mainBundle] loadNibNamed: @"NibNameHere"
owner: self
options: nil];
contentView.size = inFrame.size;
// do extra loading here
[self addSubview: contentView];
}
return self;
}
- (void)dealloc;
{
self.contentView = nil;
// additional release here
[super dealloc];
}
(Supongo que aquí está utilizando initWithFrame:
para construir la subvista).