在 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 内让它从它的数据源中读取颜色。