1

我的 UIView ( ClassA ) 有一个按钮,按下时会显示另一个 UIView ( ColorClass ),它有 3 个按钮,允许用户选择颜色。选择的颜色被传递回ClassA以便可以使用它。它也被传递给一个存储(单例)类来保存选定的颜色。

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

如何使ColorClass对调用类更加不可知?我仍在学习,所以如果有人能帮助我指出正确的方向,那就太好了。

A类

- (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 
}

颜色类

当按下选定的颜色时,我调用此方法向 ClassA 发送颜色消息。

- (void) buttonPressed : (id) sender {
        [self.vc setButtonColor:[sender tag]];
    [myStorage setButtonColor:[sender tag]];
}

布局

4

2 回答 2

3

您需要使用delegation- 当您为 a 提供数据时,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

}

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

于 2013-05-10T18:50:20.140 回答
0

另一个可能比委托少一些但松耦合的解决方案是使用NSNotification

并在选择颜色时发出通知。

如果您想要一些我可以提供的示例代码,但是NSNotification非常困难。

于 2013-05-10T19:15:18.973 回答