我有这个超级简单的例子,我不确定它为什么不起作用。 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
答案 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];
前向引用告诉编译器在编译时将使用您正在使用的类的实现,它最好用在头文件中。在实现文件中,我发现最好导入标题。