我的UIView( ClassA )有一个按钮,当按下该按钮时,它会显示另一个带有3个按钮的UIView( ColorClass ),允许用户选择一种颜色。所选的颜色被传递回 ClassA ,以便可以使用。它还将传递到Storage(单例)类,以保存选定的颜色。

这很好用,但是现在,我需要第二个不相关的类和ClassB ,以具有相同的功能。但是,当我调用相同的方法时,通常从 ClassB 内部调用 ClassA ClassA 是已更新的方法。

如何使 ColorClass 与调用类无关?我仍在学习,如果有人可以帮助我指出正确的方向,那将是很好的。

ClassA

- (void) showColorPicker{
    CGRect colorPickerFrame = CGRectMake(150, 100, 237, 215);
colorPicker= [[ColorClass alloc] initWithFrame:colorPickerFrame];
    colorPicker.vc = self;
    [self.view insertSubview:colorPicker aboveSubview:self.view];
}

- (void) setTheButtonColor : (int) c {

    Sufficient to say this just changes the buttons background color selected from a list of colors
}

ColorClass

当按下选定的颜色时,我调用此方法,用该颜色向ClassA发送消息。
- (void) buttonPressed : (id) sender {
        [self.vc setButtonColor:[sender tag]];
    [myStorage setButtonColor:[sender tag]];
}

最佳答案

您需要使用delegation-就像当您为UITableView提供数据时,它并不确切知道您的类是什么,只是它实现了指定的@protocol

定义自己的协议,该协议描述提供的回调(在ColorClass.h中使用):

@protocol ColorClassDelegate < NSObject >

- (void)colorPicker:(ColorClass *)colorPicker didPickColor:(UIColor *)color;

@end

然后在ColorClass(同样是.h文件)中,您具有代表的属性:
@property (weak, nonatomic) id < ColorClassDelegate > delegate;

选择颜色后(按下按钮):
- (void) buttonPressed : (id) sender {
    // delegate
    [self.delegate colorPicker:self didPickColor:   ## get the colour here ##   ];

    // persistent store
    [myStorage setButtonColor:[sender tag]];
}

任何使用颜色选择器的类都实现ColorClassDelegate协议
#import "ColorClass.h"

@interface ClassA < ColorClassDelegate >

并将自己设置为颜色选择器的委托。然后实现:
- (void)colorPicker:(ColorClass *)colorPicker didPickColor:(UIColor *)color
{

    // do something with the colour

}

您的原始代码传递了按钮标签来代表颜色。您可以这样做,而不用在委托方法中传递颜色。

10-02 00:43