背景:我正在通过CS193P的iTune视频学习,最近卡在了第三个作业上。基本上,该作业要求您以编程方式创建自定义视图以在屏幕上显示形状。顺便说一下,我没有使用任何视图控制器。
直到我最终拖动一个View对象到Interface Builder中并将对象名称更改为我的自定义视图类,我才能让我的视图显示出来。所以我的问题是,当人们说要以编程方式创建视图时,他们是否只是手动创建类,但需要在IB中显示它?我不能帮助感觉自己误解了什么吗?
编辑:让我更明确一些。我的自定义视图已经用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];
}
我的控制器的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方法并没有被调用。