在 Objective-C 中,如何通过 UIControl 更改类内部实例的属性?
Posted
技术标签:
【中文标题】在 Objective-C 中,如何通过 UIControl 更改类内部实例的属性?【英文标题】:In Objective-C, how can I change the property of an instance inside of class via UIControl? 【发布时间】:2017-07-05 13:56:37 【问题描述】:这道题是关于 ios Programming 4th Edition 的练习 6.9。 我有一个类可以绘制同心圆并通过随机更改颜色来响应触摸。
这里是视图的实现:
@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
和 LTHypnosisViewController
类的标题。在您的LTHypnosisViewController
中,您需要为您的LTHypnosisView
创建一个出口
LTHypnosisView: - (void) setCircleColor:(UIColor *)circleColor;
;
【参考方案1】:
一个简单的方法,我将LTHypnosisView *mainView
设为视图控制器的属性,将setCircleColor
设为public,然后在change:
方法中调用[self.mainView setCircleColor:myColor];
您还可以做一些更复杂的事情,例如在LTHypnosisView
上定义一个协议并将视图控制器设置为数据源。每当调用change:
方法时,调用[mainView updateColor]
之类的方法并在updateColor
中让它从数据源中读取颜色。
【讨论】:
您好,感谢您的回答,它确实解决了我的问题!但是我对 obj-c 非常陌生,所以,你能告诉我如何做“更多参与”的事情吗? 我认为在我的回答中选择选项 1 和选项 2 时这很有帮助:***.com/questions/12352832/… 这是一个教程:code.tutsplus.com/articles/…以上是关于在 Objective-C 中,如何通过 UIControl 更改类内部实例的属性?的主要内容,如果未能解决你的问题,请参考以下文章
在 Objective-C 中,如何通过 UIControl 更改类内部实例的属性?
如何通过 Objective-C 中的 Speech 框架实现语音到文本?
如何在 Objective-C 中使用访问器方法进行指针工作