重用课堂最佳实践

时间:2013-05-10 18:41:07

标签: ios objective-c class uiview

我的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]];
}

Layout

2 个答案:

答案 0 :(得分:3)

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

定义自己的协议,描述所提供的回调(这在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

}

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

答案 1 :(得分:0)

另一种解决方案可能比委托更少参与但松散耦合使用 NSNotification

选择颜色时发出通知。

如果你想要一些我可以提供的示例代码,但是 NSNotification 是非常紧张的。