0

我正在从我一直在学习的一本书课程中改编一个程序,它有三个类:一个视图控制器、一个视图和一个包含其他两个共享变量的单例。

我正在尝试在视图控制器中编写一些代码,这些代码随后将触发视图发送 [self setNeedsDisplay] 消息。但是,当我将其设置为实例方法时,编译器会抛出“无类方法”异常。当我将方法更改为类方法时,“self”属性不再起作用。

老实说,总的来说,我仍然对 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

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

4

1 回答 1

1

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

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

于 2014-03-25T21:51:18.700 回答