非常简单的自定义UIView,drawRect没有被调用

时间:2011-08-15 16:01:57

标签: iphone objective-c ios uiview

我有这个超级简单的例子,我不确定它为什么不起作用。 drawRect永远不会被调用。我只想要一个正方形来绘制并变成红色。我做错了什么?

//Controller.h

#import <Foundation/Foundation.h>
@class CustomView;

@interface Controller : NSObject
@property (nonatomic, retain) CustomView *cv;
@end

//Controller.m
#import "Controller.h"
#import "CustomView.h"

@implementation Controller
@synthesize cv;

- (void) awakeFromNib {
NSLog(@"awakeFromNib called");

CGRect theFrame = CGRectMake(20, 20, 100, 100);
cv = [[CustomView alloc] initWithFrame:theFrame];

UIWindow *theWindow = [[UIApplication sharedApplication] keyWindow];
[theWindow addSubview:cv];
[cv setNeedsDisplay];
}
@end

//CustomView.h
#import <UIKit/UIKit.h>
@interface CustomView : UIView
@end

//CustomView.m
#import "CustomView.h"

@implementation CustomView

- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
NSLog(@"initWithFrame called");
}
return self;
}

- (void)drawRect:(CGRect)rect {
NSLog(@"drawRect called");
self.backgroundColor = [UIColor redColor];
}
@end

2 个答案:

答案 0 :(得分:2)

您没有在drawRect中绘制任何内容。您只是在视图上设置属性。如果你覆盖了drawRect,则不会绘制任何内容 - 尝试调用[super drawRect:rect](在设置背景颜色之后)或者只是使用自己绘制正方形:

[[UIColor redColor] set];    
[[UIBezierPath bezierPathWithRect:self.bounds] fill];

编辑:

我看到你的drawRect甚至没有被调用。我不确定你的nib结构,但是尝试在控制器中将cv作为子视图添加到self.view而不是将其添加到窗口中。此外,请注意您不保留cv(使用self.cv =而不是cv =)但这应该不是问题,因为您的视图将保留它。

答案 1 :(得分:0)

而不是在Controller实现中对CustomView类进行前向引用:

@class CustomView;

尝试导入类头文件:

#import "CustomView.h"

因为您需要访问您在致电时定义的API:

cv = [[CustomView alloc] initWithFrame:theFrame];

前向引用告诉编译器在编译时将使用您正在使用的类的实现,它最好用在头文件中。在实现文件中,我发现最好导入标题。