创建一个实现某些方法的新目标c类

时间:2013-02-11 23:06:23

标签: objective-c uicontrol

在一次技术电话采访中,面试官要求我实施MiniButton类,如下所示,并要求我实现一些方法来完成UIButton方法所做的工作。

@interface MiniButton

-(void)addTarget:(id)target action:(SEL)action;
-(void)removeTarget:(id)target action:(SEL)action;
-(void)_callAllTargets;

@end

以上是给我的唯一信息。有人告诉我,我不能从UIButton继承MiniButton。此外,如果我需要,我可以假设任何本地/私人变量。

我们如何实施这些方法?

2 个答案:

答案 0 :(得分:2)

假设您允许创建UIControl的子类,则需要选择用于存储目标/操作对的数据结构。由于按钮通常不会保留其目标,因此您只需定义如下结构:

typedef struct {
    __unsafe_unretained id target;
    SEL action;
} TargetAction;

您可以将它们包装在NSMutableArray的实例中,将它们存储在NSValue中。

调用操作的最简单方法是使用performSelector:withObject:,如下所示:

TargetAction ta;
[valueWrapper getValue:&ta];
[ta.target performSelector:ta.action withObject:self];

答案 1 :(得分:0)

我想我的目标是制作一个简短的UIControl类,并将最常见的触摸事件UIControlEventTouchUpInside分解出来:

@interface MiniButton : UIControl

-(void)addTarget:(id)target action:(SEL)action;
-(void)removeTarget:(id)target action:(SEL)action;
-(void)_callAllTargets;

@end

@implementation MiniButton
-(void)addTarget:(id)target action:(SEL)action
{
    [self addTarget:target action:action forControlEvents: UIControlEventTouchUpInside];
}

-(void)removeTarget:(id)target action:(SEL)action{
    [self removeTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
}

-(void) _callAllTargets
{
     [self sendActionsForControlEvents:UIControlEventTouchUpInside];
}
@end

另一种选择可能是,他希望你扩展UIButton。但是由于UIButton是一个所谓的类集群(与工厂相当),它不应该通过子类扩展,而是可以通过在UIControl(UIButton的父类)上创建一个类来扩展。现在,无论返回什么子类,都会扩展任何按钮的任何实例。


我认为他希望你展示一些关于这个事实的知识,实际上UIButton和它真正的类只是UIControl之上的一个小层。 UIButton只有显示按钮标签,图像......的可靠性。所有其他东西都存在于UIControl及其祖先中。