Очень простой пользовательский UIView, drawRect не вызывается - PullRequest
1 голос
/ 15 августа 2011

У меня есть этот супер простой пример, и я не уверен, почему он не работает. 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 ]

2 голосов
/ 15 августа 2011

Вы ничего не рисуете в своем drawRect. Вы просто устанавливаете свойство в представлении. Если вы переопределили drawRect, ничто не будет нарисовано - попробуйте вызвать [super drawRect: rect] (после установки цвета фона) или просто нарисовать квадрат самостоятельно, используя:

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

РЕДАКТИРОВАТЬ:

Я вижу, что ваш drawRect даже не вызывается. Я не уверен в вашей структуре пера, но попробуйте добавить cv в качестве подпредставления для self.view в вашем контроллере, а не добавлять его в окно. Также обратите внимание, что вы не сохраняете cv (используйте self.cv = вместо cv =), но это не должно быть проблемой, так как ваш взгляд сохранит его.

0 голосов
/ 29 января 2013

Вместо прямой ссылки на ваш класс CustomView в реализации контроллера:

@class CustomView;

Попытка импорта файла заголовка класса:

#import "CustomView.h"

Поскольку вам требуется доступ к APIвы определили, когда вызываете:

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

Прямая ссылка сообщает компилятору, что будет реализация для класса, который вы используете во время компиляции, и лучше всего его использовать в заголовочных файлах.В файлах реализации я считаю, что лучше всего импортировать заголовок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...