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 file MyWidget.m , así como un file MyWidget.xib , donde el elemento raíz es una UIView y la class MyWidget es el propietario del file de la UIView. En el inicio de este widget hago un loadNibNamed .

En mi View Controller, hago una [[MyWidget alloc] init] , que agrego a la vista principal de View Controller como una vista secundaria. 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 algún lado, siempre tengo que comenzar con un UIViewController , que no quiero.

Si no hay una forma posible de hacerlo con un Storyboard, ¿puedo hacerlo de la manera antigua, utilizando el Storyboard para mis pantallas principales y segues, y usar un file .xib para definir vistas personalizadas?

Poner el widget / vista en un file .xib separado funciona, y es apropiado especialmente si es posible que desee hacer reference a esa 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 controller de vista en IB (click la barra negra debajo de la vista), luego arrastre una UIView desde la biblioteca de objects a la barra negra:

    introduzca la descripción de la imagen aquí

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

    introduzca la descripción de la imagen aquí

  3. Puede conectarlo a su controller de vista como si fuera a conectar cualquier otra vista: introduzca la descripción de la imagen aquí

  4. La vista agregada se muestra en el Esquema de documentos y también puede vincular acciones y references:

    introduzca la descripción de la imagen aquí


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

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

La otra solución es más complicada, pero la prefiero porque me permite ver todas mis opiniones al mismo time:

  1. Arrastre un UITableView desde la biblioteca de objects a su vista recién agregada.
  2. Luego arrastre un UITableViewCell a ese UITableView.

    introduzca la descripción de la imagen aquí

  3. Una vez que lo haces, tu vista aparece mágicamente al lado, pero tienes una UITableView que no quieres. Puede cambiar su tamaño a 0x0, o puede eliminarlo y su UIView (generalmente) seguirá siendo visible.

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

El segundo método funciona para UIViews, pero no tanto para UIToolbars, y es imposible para UIButtons, por lo que la solución más limpia que he encontrado cuando necesita include muchas subvistas diferentes es adjuntar una única UIView secundaria a su controller de vista como un contenedor que nunca se muestra, coloca todas tus vistas secundarias allí y utiliza el truco UITableViewCell para hacer que todo sea visible. Cambié el tamaño de mi ficticia UITableView a 0x0 para hacer eso invisible. Aquí hay una captura de pantalla de cómo se ve todo junto:

introduzca la descripción de la imagen aquí

Si solo busca hacer que sus controlleres de vista sean más allá (y no en su tablero de historias), entonces hay una manera bastante simple de lograr esto:

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

2) Agregue un UIViewController (o lo que fuera la superclass de su CustomViewController ) a la story-board.

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

introduzca la descripción de la imagen aquí

4) Finalmente, en su viewDidLoad , 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 get la instancia de viewcontroller específico de Storyboard y usar la vista encima.

 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