【发布时间】:2011-06-16 17:54:47
【问题描述】:
一点背景知识:我正在浏览 CS193P iTune 视频,并且我被困在作业 3 上的时间最长。基本上,作业要求您以编程方式创建自定义视图以在屏幕上显示形状。顺便说一句,我没有使用任何视图控制器。
直到我最终在 Interface Builder 中拖动一个 View 对象并将对象名称更改为我的自定义视图类之前,我无法显示我的视图。所以我的问题是当人们说以编程方式创建视图时,他们只是说手动创建类但是当你需要显示它时使用 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 没有被调用。
【问题讨论】:
-
keyWindow 是在哪里创建的?如果您没有加载 nib 文件(从您的问题中不清楚您是否加载),那么您必须先创建窗口,然后再添加子视图。
-
它是在 AppDelegate 类中创建的。这是否意味着我必须在那里 #import 我的 polygonView 类并在那里创建它?
-
有趣的是,如果我将初始化并将视图添加到我的 updateInterface 方法中的窗口,它会起作用,但只有在我单击调用该方法的按钮之后。代码似乎不是 awakeFromNib 中的进程。有什么想法吗?
-
学过课程的人可以分享他们的控制器代码吗?此作业不适用于实际课程;我只是想自己学习 Obj-C。在这一点上,我了解了大部分情况,但显然我在这里遗漏了一些东西。
-
共识表明我在代码中的内容是正确的,尽管似乎没有人能够告诉我为什么从我的控制器的 awakeFromNib 方法调用时没有绘制视图。我会考虑解决这个问题,因为无论如何我都会学习视图控制器。
标签: iphone objective-c ios views