Creación de vistas mediante progtwigción en IOS (¿cómo funciona?)

Un poco de historia: estoy pasando por los videos de CS193P iTune y estuve atrapado en la tarea 3 durante mucho time. Básicamente, la asignación le pide que, mediante progtwigción, cree una vista personalizada para mostrar una forma en la pantalla. No estoy usando controlleres de vista por cierto.

No pude hacer que mi vista se mostrara hasta que finalmente arrastré un object View en Interface Builder y cambié el nombre del object a mi class de vista personalizada. Entonces, mi pregunta es cuando las personas dicen que crean una vista mediante progtwigción, ¿están diciendo que crean manualmente la class pero cuando necesitan mostrarla usan IB? ¿No puedo evitar sentir que he entendido mal algo?

editar: déjame ser más claro. Mi vista personalizada se ha inicializado con un marco de 0, 0, 200, 150 y drawRect se anula para dibujar un cuadrado en él. Mi vista ni siquiera aparece si bash agregarla a la window principal dentro de mi controller:

UIWindow* window = [UIApplication shanetworkingApplication].keyWindow; [window addSubview:polygonView]; 

Sin embargo, si usa arrastrar una vista en IB y cambia la class a mi class de vista, aparece bien.

Editar: se agregó un código. Este es el método awakeFromNib de mi controller donde se debe dibujar la vista.

  - (void)awakeFromNib { shape = [[PolygonShape alloc] initWithNumberOfSides:numberOfSidesLable.text.integerValue minimumNumberOfSides:3 maximumNumberOfSides:12]; polygonView = [[PolygonView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; UIWindow *window = [UIApplication shanetworkingApplication].keyWindow; polygonView.backgroundColor = [UIColor blackColor]; [window addSubview:polygonView]; [self updateInterface]; } 

Parte del método updateInterface de mi controller:

 - (void)updateInterface { [polygonView setPolygon:shape]; [polygonView setNeedsDisplay]; ... } 

PolygonView.h

 #import <UIKit/UIKit.h> #import "PolygonShape.h" @interface PolygonView : UIView { IBOutlet PolygonShape *polygon; } @property (readwrite, assign) PolygonShape *polygon; - (void)drawRect:(CGRect)rect; @end 

PolygonView.m

 #import "PolygonView.h" @implementation PolygonView @synthesize polygon; - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { nslog(@"initialized"); } return self; } - (void)drawRect:(CGRect)rect { CGRect bounds = [self bounds]; [[UIColor grayColor] set]; UIRectFill(bounds); CGRect square = CGRectMake(10, 10, 10, 100); [[UIColor blackColor] set]; UIRectFill(square); [[UIColor networkingColor] set]; UIRectFill(square); NSLog(@"drawRect called"); } @end 

El polygonView se está inicializando, pero no se llama al drawRect.

Para ser aún más específico a su pregunta, la syntax sería

 UIWindow* window = [UIApplication shanetworkingApplication].keyWindow; UIView *polygonView = [[UIView alloc] initWithFrame: CGRectMake ( 0, 0, 200, 150)]; //add code to customize, eg polygonView.backgroundColor = [UIColor blackColor]; [window addSubview:polygonView]; [polygonView release]; 

Este es un patrón que usará no solo para esto, sino para las subidas posteriores. Además, otra nota es con muchas de las templates, el viewController ya está configurado con su propia vista. Cuando desea crear una vista personalizada, la crea como la anterior, pero en lugar del método anterior, configure la vista viewControllers en la vista recién creada como tal:

 viewController.view = polygonView; 

¡Buena suerte!

Esta es una vieja pregunta, pero no estoy seguro de que obtuvo la respuesta que esperaba, suena como si se topara con el mismo problema en el que creé una subclass UIViewController , UIViewController un UIViewController en una interfaz de generador pero no pude averiguar cómo hacer que los dos trabajen unos con otros.

Si hizo la plumilla por separado (por lo que no se hizo para usted junto con su class), debe recordar hacer clic en UIViewController que colocó en el generador de la interfaz y luego, desde el panel de properties, click el button de la tercera pestaña ('Clase personalizada ') La Class será la class base pnetworkingeterminada UIViewController etc., solo abra esta list desplegable y verá una list de todas sus subclasss personalizadas, selecciónela y volla: ha vinculado su elemento personalizado a la interfaz.

Espero que salve a alguien los días que tardé en descubrirlo, encontré algunas forms estupendamente maravillosas de solucionarlo hasta que me di count de la solución simple.

Necesita tener una vista (o window) para agregar una subvista a. La syntax normal es así:

 UIView *newView = [[UIView alloc] initWithFrame:mainView.bounds]; [mainView addSubview:newView]; [newView release]; 

Por supuesto, si tiene un object personalizado que henetworkinga de UIView, usaría eso en lugar de UIView. Cuando inicie un nuevo proyecto, cree una "aplicación basada en la vista", que lo iniciará con un controller de vista con una vista asociada (a la que se puede acceder con "CustomViewController.view", que replaceía a "mainView" en el fragment de código encima).

Si desea crear la vista mediante progtwigción cuando se inicia la aplicación, coloque el código en el método "- (void) viewDidLoad" de su controller de vista.

hola solo agrega este codigo,

 [window bringSubviewToFront:polygonView]; right after, [window addSubview:polygonView]; 

En algún lugar de su class de controller activo, puede agregar una vista personalizada a la vista actual de nivel superior.

 [ myCurrentTopView addSubview: myNewCustomView ]; 

Ayuda a asignar e inicializar esta vista personalizada primero.

Luego, puede activar un dibujo en drawRect de esta vista personalizada haciendo lo siguiente:

 [ myNewCustomView setNeedsDisplay ]; 

¿Configuró el color de background de su vista en algo distinguible?

¿Estás seguro de que tu vista no se muestra o es solo que no puedes verla? Coloque un NSLog en drawRect: método de su vista (si usa una class de vista personalizada).

Tuve un problema muy similar recientemente y esto es lo que funcionó para mí: Parece que al comenzar con una 'aplicación vacía' en Xcode 4.3.2, debe configurar su vista como la raíz vista de su window principal utilizando el método setRootViewController en lugar de addSubview . Asi que:

 // Initialize myView and then [window setRootViewController:myView]; // instead of [window addSubview:myView]; // the rest as normal... [window makeKeyAndVisible]; 

Después de eso, puede usar el método addSubview para agregar vistas adicionales.

llamada

 [super drawRect]; 

antes de su código personalizado en drawRect: cuerpo.