在一次技术电话采访中,面试官要求我实施MiniButton类,如下所示,并要求我实现一些方法来完成UIButton方法所做的工作。
@interface MiniButton
-(void)addTarget:(id)target action:(SEL)action;
-(void)removeTarget:(id)target action:(SEL)action;
-(void)_callAllTargets;
@end
以上是给我的唯一信息。有人告诉我,我不能从UIButton继承MiniButton。此外,如果我需要,我可以假设任何本地/私人变量。
我们如何实施这些方法?
答案 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及其祖先中。