Немного предыстории: я просматриваю видео CS193P iTune и очень долго застрял в задании 3. По сути, в задании предлагается программно создать настраиваемое представление для отображения фигуры на экране. Кстати, я не использую контроллеры представления.
Я не мог заставить свое представление отображаться, пока я, наконец, не перетащил объект View в Interface Builder и не изменил имя объекта на свой собственный класс представления. Итак, мой вопрос: когда люди говорят о программном создании представления, они просто говорят, что нужно создать класс вручную, но когда вам нужно отобразить его, используйте IB? Не могу избавиться от ощущения, что я что-то неправильно понял?
edit: позвольте мне быть более ясным. Мое пользовательское представление было инициализировано с кадром 0, 0, 200, 150, и drawRect переопределен, чтобы нарисовать в нем квадрат. Мое представление даже не отображается, если попытаться добавить его в главное окно в моем контроллере:
UIWindow* window = [UIApplication sharedApplication].keyWindow;
[window addSubview:polygonView];
Однако, если использовать перетаскивание представления в IB и изменить класс на мой класс представления, он отображается нормально.
Изменить : Добавлен код. Это метод awakeFromNib моего контроллера, в котором должно быть нарисовано представление.
- (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];
}
Часть моего контроллера ' s метод updateInterface:
- (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
polygonView инициализируется, но drawRect не вызывается.