在 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 属性。我该怎么做?

【问题讨论】:

发布 LTHypnosisViewLTHypnosisViewController 类的标题。在您的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 中使用访问器方法进行指针工作

如何在 Objective-C 中获取用户的语言环境?

如何通过 Interface Builder 在 Objective-C 中实现搜索栏

iOS - 如何通过 Objective-C 定位我的 iPad/iPhone 上的所有文件