Vistas personalizadas con Storyboard

En pantallas complejas (View Controllers) solía separar todo en pedazos más pequeños (los llamo widgets). Estos widgets consisten básicamente en un MyWidget.h y un archivo MyWidget.m , así como un archivo MyWidget.xib , donde el elemento raíz es una UIView y la clase MyWidget es el propietario del archivo de UIView. En el inicio de este widget, hago un loadNibNamed .

En mi Controlador de Vista, hago un [[MyWidget alloc] init] , que agrego a la vista principal del Controlador de Vista como una sub-vista. Esto, hasta ahora, funciona perfectamente.

Ahora me pregunto cómo hacer lo mismo con el guión gráfico, porque realmente no puedo empezar a arrastrar en una UIView alguna parte, siempre tengo que comenzar con un UIViewController , que no quiero.

Si no hay forma posible de hacerlo con un Storyboard, ¿puedo simplemente hacerlo a la antigua usanza del Storyboard para mis pantallas principales y segues, y usar un archivo .xib separado para definir vistas personalizadas?

Poner el widget / vista en un archivo .xib separado funciona, y es apropiado especialmente si desea hacer referencia a la misma vista desde múltiples Controladores de Vista.

Sin embargo, a veces desea ver la vista / widget adicional dentro del mismo guión gráfico, y es posible. Así es como lo haces:

  1. Seleccione su controlador de vista en IB (haga clic en la barra negra debajo de la vista), luego arrastre un UIView desde la Biblioteca de objetos a la barra negra:

    enter image description here

  2. Cuando una vista está en la barra negra, se instancia como cualquier otra vista en IB pero simplemente no se agrega a la jerarquía de la vista hasta que lo haga en el código. Cambie la clase de la vista para que coincida con su propia subclase si es necesario:

    enter image description here

  3. Puede conectarlo a su controlador de vista como lo haría con cualquier otra vista: enter image description here

  4. La vista agregada aparece en el Esquema del documento y también puede conectar acciones y referencias allí:

    enter image description here


Ahora, el problema que queda es que en realidad no se puede ver la vista, sin importar cuántas veces intente hacer clic o hacer doble clic, lo que frustraría todo el propósito de colocarlo en el mismo guión gráfico. Afortunadamente, hay dos soluciones que conozco.

La primera solución consiste en volver a arrastrar la vista desde la barra negra a la vista del controlador de vista, editarla y volver a arrastrarla a la barra negra una vez que haya terminado. Esto es problemático pero confiable.

La otra solución es más delicada, pero la prefiero porque me permite ver todos mis puntos de vista al mismo tiempo:

  1. Arrastre una UITableView desde la Biblioteca de objetos a la vista recién agregada.
  2. A continuación, arrastre un UITableViewCell en ese UITableView.

    enter image description here

  3. Una vez que haces eso, tu vista aparece mágicamente a un lado, pero tienes una UITableView que no deseas. Puedes cambiar el tamaño a 0x0, o puedes eliminarlo y tu UIView (normalmente) seguirá estando visible.

  4. Ocasionalmente, la vista secundaria se ocultará nuevamente en IB. Puede repetir los pasos anteriores si eliminó el UITableView, o si el UITableView todavía está en la jerarquía, solo tiene que hacer clic en UITableViewCell y la vista volverá a aparecer.

El segundo método funciona para UIView pero no tan bien para UIToolbars y es imposible para UIButtons, así que la solución más limpia que he encontrado cuando necesitas incluir muchas subvistas diferentes es adjuntar una sola UIView secundaria a tu controlador de vista como un contenedor que nunca se muestra, coloque todas sus vistas secundarias allí, y use el truco UITableViewCell para hacer que todo sea visible. Cambié el tamaño de mi UITableView ficticio a 0x0 para que sea invisible. Aquí hay una captura de pantalla de cómo se ve todo junto:

enter image description here

Si solo busca hacer sus controladores de vista en otro lugar (y no en su tablero de historia), entonces hay una manera bastante simple de lograr esto:

1) Cree su CustomViewController s ( abcdController en el código que probé) con sus xib individuales como de costumbre.

2) Agregue un UIViewController (o lo que sea que sea la superclase de su CustomViewController ) al CustomViewController .

3) Establezca CustomClass en CustomViewController lugar de UIViewController como se muestra aquí:

enter image description here

4) Finalmente, en su viewDidLoad , cargue el xib personalizado y listo.

 - (void)viewDidLoad { [super viewDidLoad]; [[NSBundle mainBundle] loadNibNamed:@"abcdController" owner:self options:nil]; // Do any additional setup after loading the view from its nib. } 

Creo que puedes hacer algo como esto para obtener instancias de viewcontroller específicos de Storyboard y usar view en la parte superior.

 ex: MyViewController* myViewController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"myViewController"]; UIView* view = myViewController.view; //Get the view from your StoryBoard. 

Espero que esto ayude

Gracias Vijay