Un poco de historia: estoy repasando los videos CS193P iTune y me quedé atrapado en la tarea 3 por mucho tiempo. Básicamente, la tarea le pide que cree programáticamente una vista personalizada para mostrar una forma en la pantalla. No estoy usando ningún controlador de vista por cierto.Creación mediante programación de vistas en IOS (¿cómo funciona)?
No pude ver mi vista hasta que finalmente arrastré un objeto View en Interface Builder y cambié el nombre del objeto a mi clase de vista personalizada. Entonces, mi pregunta es cuando las personas dicen que creen una vista de forma programática. ¿Acaban de decir que crean la clase manualmente pero cuando necesitan mostrarla usan IB? No puedo evitar sentirme como si hubiera 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 reemplaza para dibujar un cuadrado. Mi punto de vista ni siquiera aparece si intento de añadir a la ventana principal dentro de mi controlador:
UIWindow* window = [UIApplication sharedApplication].keyWindow;
[window addSubview:polygonView];
Sin embargo, si el uso de arrastrar una vista en IB y cambiar la clase a mi clase de vista, se muestra bien.
Editar: Se ha añadido algún código. Este es el método awakeFromNib de mi controlador donde debe dibujarse 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 sharedApplication].keyWindow;
polygonView.backgroundColor = [UIColor blackColor];
[window addSubview:polygonView];
[self updateInterface];
}
Parte del método updateInterface de mi controlador:
- (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 redColor] set];
UIRectFill(square);
NSLog(@"drawRect called");
}
@end
se está inicializando El polygonView pero el drawRect ISN no se está hablando re.
¿Dónde se está creando la keyWindow? Si no está cargando un archivo nib (no está claro en su pregunta si lo es o no), entonces tendría que crear la ventana primero antes de agregar su subvista. – jlehr
Se está creando en la clase AppDelegate. ¿Esto significa que tengo que Importar mi clase polygonView allí y crearla allí? –
Curiosamente, si pongo la inicialización y la adición de mi vista a la ventana en mi método updateInterface, funciona, pero solo después de hacer clic en un botón que llama al método. Parece que el código no está siendo procesos en awakeFromNib. ¿Algunas ideas? –