在 Objective-C 中,如何通过 UIControl 更改 class 中实例的 属性?
In Objective-C, how can I change the property of an instance inside of class via UIControl?
这道题是关于iOS Programming 4th Edition 的练习6.9。
我有一个 class 可以绘制同心圆并通过随机改变颜色来响应触摸。
下面是视图的实现:
@implementation LTHypnosisView
- (instancetype) initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self){
self.backgroundColor = [UIColor clearColor];
self.circleColor = [UIColor lightGrayColor];
}
return self;
}
- (void)drawRect:(CGRect)rect {
//Draw the circles
}
- (void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
float red = (arc4random() % 100) /100.0;
float green = (arc4random() % 100) /100.0;
float blue = (arc4random() % 100) /100.0;
UIColor *randomColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0];
self.circleColor = randomColor;
}
- (void) setCircleColor:(UIColor *)circleColor{
_circleColor = circleColor;
[self setNeedsDisplay];
}
@end
下面是 viewController 的实现:
@implementation LTHypnosisViewController
- (void) viewDidLoad{
CGRect screenRect = self.view.bounds;
LTHypnosisView *mainView = [[LTHypnosisView alloc] initWithFrame:screenRect];
[self addSubview:mainView]
NSArray *items = @[@"Red",@"Green",@"Blue"];
UISegmentedControl *segControl = [[UISegmentedControl alloc] initWithItems:items];
[segControl addTarget:self
action:@selector(change:)
forControlEvents:UIControlEventValueChanged];
segControl.frame = CGRectMake(10, 50, self.view.bounds.size.width-20, 60);
segControl.selectedSegmentIndex = 0;
segControl.backgroundColor = [UIColor whiteColor];
[self.view addSubview:segControl];
}
- (void) change:(UISegmentedControl*)sender{
switch (sender.selectedSegmentIndex) {
//How should I write here??
}
}
@end
我想用 UISegmentedControl
改变同心圆的颜色。因此,我需要 viewController 中的一个方法来更改 LTHypnosisView 实例的 _circleColor 属性。我该怎么做?
一个简单的方法,我将 LTHypnosisView *mainView
设为视图控制器的 属性,设为 setCircleColor
public,然后在 change:
方法中致电 [self.mainView setCircleColor:myColor];
您还可以做一些更复杂的事情,比如在 LTHypnosisView
上定义一个协议并将视图控制器设置为数据源。每当调用 change:
方法时,调用类似 [mainView updateColor]
的方法,并在 updateColor
内让它从它的数据源中读取颜色。
这道题是关于iOS Programming 4th Edition 的练习6.9。 我有一个 class 可以绘制同心圆并通过随机改变颜色来响应触摸。
下面是视图的实现:
@implementation LTHypnosisView
- (instancetype) initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self){
self.backgroundColor = [UIColor clearColor];
self.circleColor = [UIColor lightGrayColor];
}
return self;
}
- (void)drawRect:(CGRect)rect {
//Draw the circles
}
- (void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
float red = (arc4random() % 100) /100.0;
float green = (arc4random() % 100) /100.0;
float blue = (arc4random() % 100) /100.0;
UIColor *randomColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0];
self.circleColor = randomColor;
}
- (void) setCircleColor:(UIColor *)circleColor{
_circleColor = circleColor;
[self setNeedsDisplay];
}
@end
下面是 viewController 的实现:
@implementation LTHypnosisViewController
- (void) viewDidLoad{
CGRect screenRect = self.view.bounds;
LTHypnosisView *mainView = [[LTHypnosisView alloc] initWithFrame:screenRect];
[self addSubview:mainView]
NSArray *items = @[@"Red",@"Green",@"Blue"];
UISegmentedControl *segControl = [[UISegmentedControl alloc] initWithItems:items];
[segControl addTarget:self
action:@selector(change:)
forControlEvents:UIControlEventValueChanged];
segControl.frame = CGRectMake(10, 50, self.view.bounds.size.width-20, 60);
segControl.selectedSegmentIndex = 0;
segControl.backgroundColor = [UIColor whiteColor];
[self.view addSubview:segControl];
}
- (void) change:(UISegmentedControl*)sender{
switch (sender.selectedSegmentIndex) {
//How should I write here??
}
}
@end
我想用 UISegmentedControl
改变同心圆的颜色。因此,我需要 viewController 中的一个方法来更改 LTHypnosisView 实例的 _circleColor 属性。我该怎么做?
一个简单的方法,我将 LTHypnosisView *mainView
设为视图控制器的 属性,设为 setCircleColor
public,然后在 change:
方法中致电 [self.mainView setCircleColor:myColor];
您还可以做一些更复杂的事情,比如在 LTHypnosisView
上定义一个协议并将视图控制器设置为数据源。每当调用 change:
方法时,调用类似 [mainView updateColor]
的方法,并在 updateColor
内让它从它的数据源中读取颜色。