这是目前的情况:
TestViewController.h:
#import <UIKit/UIKit.h>
@interface TestViewController : UIViewController {
}
@end
TestViewController.m:
#import "TestViewController.h"
#import "draw.h"
@implementation TestViewController
- (void)viewDidLoad {
draw.rectColor = [UIColor colorWithHue:0.6 saturation:0.6 brightness:0.6 alpha:1].CGColor;
[draw setNeedsDisplay];
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)dealloc {
[super dealloc];
}
@end
draw.h:
#import <UIKit/UIKit.h>
@interface draw : UIView {
UIColor* rectColor;
}
@property (retain) UIColor* rectColor;
@end
draw.m:
#import "draw.h"
@implementation draw
@synthesize rectColor;
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
// Initialization code.
}
return self;
}
- (void)drawRect:(CGRect)rectangle {
CGContextRef context = UIGraphicsGetCurrentContext();
CGColorRef myColor = [UIColor colorWithHue:0 saturation:1 brightness:0.61 alpha:1].CGColor;
CGContextSetFillColorWithColor(context, myColor);
CGContextAddRect(context, CGRectMake(0, 0, 95.0, 110.0));
CGContextFillPath(context);
}
- (void)dealloc {
[super dealloc];
}
@end
然后在Interface Builder中我创建了一个90x115的UIView,并将它的Class Identity设置为“draw”。 当我运行应用程序(没有两个非编译行)时,它会在屏幕中间显示一个漂亮的红色矩形。我的目标是能够从TestViewController中更改矩形的颜色。但是,当我编译测试应用程序时,我得到以下编译器错误:
error: accessing unknown 'setRectColor:' class method
error: object cannot be set - either readonly property or no setter found
warning: 'draw' may not respond to '+setNeedsDisplay'
我知道我错过了我的TestViewController和draw之间的“链接”,但无法弄清楚如何实现它。我尝试了各种技巧,但没有任何效果。 有人可以解释为了
需要做些什么draw.rectColor = [UIColor colorWithHue:0.6 saturation:0.6 brightness:0.6 alpha:1].CGColor;
[draw setNeedsDisplay];
编译和工作? (我会用这个知识在TestViewController中创建一个不同的方法,我只是在viewDidLoad中测试它)
答案 0 :(得分:1)
在你发布的代码中,你设置了rectColor属性并在draw上调用setNeedsDisplay:但是draw是你的类。您需要对实例执行此操作。您不需要为此创建新属性,因为UIViewController定义了view属性。只需在viewDidLoad方法中使用self.view
代替draw
即可。另外,删除该行末尾的.CGColor
。
其次,drawRect:方法忽略该颜色并使用它自己的颜色。变化
CGColorRef myColor = [UIColor colorWithHue:0 saturation:1 brightness:0.61 alpha:1].CGColor;
到
CGColorRef myColor = self.rectColor.CGColor;
答案 1 :(得分:0)
这里的一个大问题是你没有为draw
宣布一个属性;如果要访问它,必须执行此操作并将其链接到Interface Builder对象。解决方案是创建一个包含draw
对象的属性,并使用@synthesize
合成其setter和getter。 (最后一部分就是你收到错误的原因。)
将代码更改为我在下面的代码后,您需要在Interface Builder中进行正确的连接,否则您会发现代码更改根本没有效果,即使它们没有错误。
大写你的班级名称(总是!),然后试试这个:
TestViewController.h:
#import <UIKit/UIKit.h>
@class Draw; //forward class declaration
@interface TestViewController : UIViewController {
IBOutlet Draw *drawCopy;
}
@property (nonatomic, retain) Draw *drawCopy;
@end
然后,对于TestViewController.m:
#import "TestViewController.h"
#import "Draw.h"
@implementation TestViewController
@synthesize drawCopy;
-(void) viewDidLoad {
self.drawCopy.rectColor = [UIColor colorWithHue:0.6 saturation:0.6 brightness:0.6 alpha:1];
[self.drawCopy setNeedsDisplay];
[super viewDidLoad];
}
- (void)dealloc {
[drawCopy release];
[super dealloc];
}
@end
我认为应该这样做。
答案 2 :(得分:0)
你定义UIColor* rectColor;
,但你也写了一个CGColor
draw.rectColor = [UIColor colorWithHue:0.6 saturation:0.6 brightness:0.6 alpha:1].CGColor;
尝试
self.drawCopy.rectColor = [UIColor colorWithHue:0.6 saturation:0.6 brightness:0.6 alpha:1];