你能从一个班级发送一条消息来触发另一个班级的“自我”吗?

时间:2014-03-25 21:20:36

标签: ios objective-c cocoa-touch setneedsdisplay

我正在调整我一直关注的书籍课程中的程序,并且有三个类:一个视图控制器,一个视图和一个包含另一个共享变量的单例。

我正在尝试在视图控制器中编写一些代码,随后会触发视图以发送[self setNeedsDisplay]消息。但是,当我将其设置为实例方法时,编译器会抛出一个“无类”方法'例外。当我将方法改为类方法时,自我'财产不再有效。

我说实话,我仍然可以理解OOP的许多区别,所以我可能没有完全掌握这种情况。但我想知道,是否有可能从一个班级向另一个班级发送一条消息,触发第二堂课启动“自我”。动作?

以下是视图控制器中发送消息的代码(使用我当前的编码尝试):

- (IBAction)indexChanged:(UISegmentedControl *)sender
{
    switch (sender.selectedSegmentIndex)
    {
        case 0:
        {
            UIColor *selectedColor = [UIColor colorWithRed:1.0
                                                     green:0.0
                                                      blue:0.0
                                                     alpha:1.0];
            NSLog(@"Red button pressed");
            [BNRHypnosisView setCircleColor:selectedColor];
            break;
        }
...

以下是视图类中将接收消息的代码:

- (void)setCircleColor:(UIColor *)circleColor
{
    [[CDFSingleton colorPicker] changeCircleColor:circleColor];
    [self setNeedsDisplay];
}

不确定它有多相关,但这是我的单身人士课程:

@implementation CDFSingleton

+ (CDFSingleton *) colorPicker
{
    static CDFSingleton *colorPicker = nil;
    if (!colorPicker) {
        colorPicker = [[super allocWithZone:nil] init];
    }

    return colorPicker;
}

+ (id)allocWithZone:(struct _NSZone *)zone
{
    return [self colorPicker];
}

- (id)init
{
    self = [super init];
    if (self) {
        //In this case, set the default circleColor to light gray
        _circleColor = [UIColor lightGrayColor];
        NSLog(@"Initial colour set to light gray (%@)", _circleColor);
    }

    return self;
}

- (void)changeCircleColor:(UIColor *)color
{
    _circleColor = color;
    NSLog(@"Circle colour changed to %@", color);
    NSLog(@"_circleColor currently set to %@", _circleColor);
}

@end

如果有人对此有任何想法和/或意见,我很乐意听到他们的声音!

1 个答案:

答案 0 :(得分:1)

好的,所以,当你有两个字符串 - 比如@"kitten"@"puppy"时 - 如果你想得到一个特定字符串的长度,你会问这个字符串的长度。例如,您可以编写[@"kitten" length]并获得答案6。你不会写[NSString length],因为你不想要NSString类的长度 - 你想要包含单词" kitten"的特定NSString的长度。 / p>

您自己的课程以同样的方式工作。就像你想知道某个特定NSString的内容时你不会与NSString类交谈一样,你不想与BNRHypnosisView类交谈以影响应用程序中显示的视图。相反,您需要向视图控制器传递对正在显示的特定BNRHypnosisView的引用。