Vistas personalizadas con Storyboard

96

En pantallas complejas (Controladores de vista), solía separar todo en partes más pequeñas (las llamo widgets). Estos widgets consisten básicamente en MyWidget.hun MyWidget.marchivo y un MyWidget.xibarchivo, donde el elemento raíz es un UIViewy la clase MyWidget es el propietario del archivo de UIView. En el inicio de este widget hago un loadNibNamed.

En mi View Controller, luego hago una [[MyWidget alloc] init], que agrego a la vista principal del View's Controller como una subvista. Esto, hasta ahora, funciona perfectamente.

Ahora me pregunto cómo hacer lo mismo con el guión gráfico, porque realmente no puedo comenzar a arrastrar un UIViewlugar, siempre tengo que comenzar con un UIViewController, lo cual no quiero.

Si no hay forma posible de hacer esto con un Storyboard, ¿puedo simplemente hacerlo de la manera anterior, usando el Storyboard para mis pantallas principales y segues, y usar un archivo .xib separado para definir vistas personalizadas?

znq
fuente
¿Desea crear xibmensajes de correo electrónico para sus controladores de vista por separado y no en el guión gráfico?
tipycalFlow
¿Ha encontrado una solución para esto?
aryaxt
@aryaxt: Estoy usando una mezcla de Storyboard y xib's. Storyboard para las pantallas principales y xib's con solo una UIView como raíz para vistas complejas o widgets. Así que no es realmente una respuesta a mi pregunta original (mediante el uso de un guión gráfico), pero básicamente hago lo mismo que hice antes.
znq
en estos días, solo use una vista de contenedor , es realmente así de simple ... stackoverflow.com/questions/23399061/…
Fattie

Respuestas:

189

Poner el widget / vista en un archivo .xib separado funciona y es apropiado especialmente si desea hacer referencia 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 controlador de vista en IB (haga clic en la barra negra debajo de la vista), luego arrastre una UIView desde la Biblioteca de objetos a la barra negra:

    ingrese la descripción de la imagen aquí

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

    ingrese la descripción de la imagen aquí

  3. Puede conectarlo a su controlador de vista como lo haría con cualquier otra vista: ingrese la descripción de la imagen aquí

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

    ingrese la descripción de la imagen aquí


Ahora, el problema que permanece es que en realidad no 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 ponerlo en el mismo guión gráfico. Afortunadamente, hay dos soluciones que conozco.

La primera solución es arrastrar la vista desde la barra negra a la vista del controlador de vista, editarla y luego 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 todas mis vistas al mismo tiempo:

  1. Arrastre un UITableView desde la biblioteca de objetos a su vista recién agregada.

  2. Luego, arrastre un UITableViewCell a ese UITableView.

    ingrese la descripción de la imagen aquí

  3. Una vez que lo hace, su vista aparece mágicamente a un lado, pero tiene un UITableView que no desea. Puede cambiar el tamaño a 0x0, o puede eliminarlo y su UIView (generalmente) seguirá siendo visible.

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

El segundo método funciona para UIViews pero no tan bien para UIToolbars y es imposible para UIButtons, por lo que la solución más limpia que he encontrado cuando necesita incluir muchas subvistas diferentes es adjuntar una única UIView secundaria a su 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. Cambio el tamaño de mi UITableView ficticio a 0x0 para hacerlo invisible. Aquí hay una captura de pantalla de cómo se ve todo junto:

ingrese la descripción de la imagen aquí

nioq
fuente
Marzo de 2013, no necesitaba hacer esto: debe ignorar la barra negra por completo y arrastrar / soltar su vista directamente en la vista principal, y funciona bien (Xcode 4.5+)
Adam
¿Es posible reutilizar ese uivew personalizado en el mismo ViewController? Si ex. necesitaba dos uivews personalizados - ¿Y si es así como?
Morten Gustafsson
2
Maldita sea, prefiero crear un xib separado. Probablemente no recordaré todo esto cuando tenga que actualizar la aplicación en 6 meses.
Sandy
Aunque esta es una respuesta increíble, accidentalmente encontré otra manera mejor, creo. Al conectar tomas de corriente a componentes de visualización reales. Si pasa el cursor un poco sobre un componente de dicha vista interna, aparecerá para facilitar la selección. Luego lo ves en el guión gráfico ...
Oded Ben Dov
7
Si bien esta es una respuesta histórica increíblemente admirable, en realidad ahora está totalmente desactualizada. Apple solucionó todo el problema mediante la introducción de "vistas de contenedor", que ahora es lo básico y central que se hace al crear aplicaciones: todo es una "vista de contenedor" todo el tiempo. ¡Gracias a Dios, ahora es muy fácil!
Fattie
11

Si solo está buscando hacer que sus controladores de vista estén en otro lugar (y no en su guión gráfico), entonces hay una manera bastante simple de lograr esto:

1) Cree sus CustomViewControllers ( abcdControlleren el código que probé) con sus xibs individuales como de costumbre.

2) Agregue UIViewController(o lo que sea su superclase CustomViewController) al guión gráfico.

3) Configure CustomClass en CustomViewControllerlugar de UIViewControllercomo se muestra aquí:

ingrese la descripción de la imagen aquí

4) Finalmente, en su viewDidLoad, cargue el archivo personalizado xiby listo.

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSBundle mainBundle] loadNibNamed:@"abcdController" owner:self options:nil];
    // Do any additional setup after loading the view from its nib.
}
tipycalFlow
fuente
3
Gracias por su respuesta muy detallada, pero en realidad no estoy buscando un controlador de vista personalizado, sino una vista personalizada (un widget), que se agrega a un UIViewController estándar. Entonces, el controlador de vista no es el problema, pero me preguntaba cuál es el mejor enfoque para crear widgets personalizados. A) hazlo como lo hice antes, con un archivo .xib o B) algún otro enfoque que aún no conozco :-)
znq
1
Hmm ... creo que tengo lo que quieres. Básicamente, desea manejar varias vistas con el mismo controlador, ¿verdad? No puedo pensar en otra manera que no sea loadNibNameden ese caso ... XO
tipycalFlow
Esto me resolvió este problema: stackoverflow.com/questions/11047991/… Sin embargo, en lugar de viewDidLoad, usé loadView ...
Morkrom
1
Solo para repetir, todo esto (¡gracias a Dios!) Está totalmente desactualizado ahora que las vistas de contenedores están aquí. Simplemente haga clic en una vista de contenedor y todo
estará
1

Creo que puede hacer algo como esto para obtener una instancia de un controlador de vista 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

vijay_hrd
fuente