0

技術的な電話インタビューで、インタビュアーは私にフォローのようなMiniButtonクラスを実装するように依頼し、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

もう 1 つのオプションは、UIButton を拡張してほしいというものでした。ただし、UIButton はいわゆるクラス クラスター (ファクトリに相当) であるため、サブクラス化によって拡張する必要はありませんが、UIButton の親クラスである UIControl にカテゴリを作成することによって拡張できます。これで、返されるサブクラスに関係なく、任意のボタンの任意のインスタンスが拡張されます。


彼は、実際には UIButton と実際のクラスは UIControl の上の小さなレイヤーにすぎないという事実についての知識を示してほしいと思っていたと思います。UIButton には、ボタンのラベル、画像、… を表示するという可能性しかありません。他のすべてのものは UIControl にあり、その祖先です。

于 2013-02-11T23:22:02.913 に答える