0

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

@interface MiniButton

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

@end

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

我们如何实现这些方法?

4

2 回答 2

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];
于 2013-02-11T23:34:05.313 回答
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是一个所谓的类簇(相当于一个工厂),它不应该通过子类来扩展,而是可以通过在UIButton的父类UIControl上创建一个类来扩展。现在,任何按钮的任何实例都被扩展,无论返回什么子类。


我想他想让你展示一些关于这个事实的知识,实际上 UIButton 和它真正的类只是 UIControl 之上的一个小层。UIButton 只能显示按钮的标签、图像……。所有其他东西都驻留在 UIControl 和它的祖先中。

于 2013-02-11T23:22:02.913 回答