5

UIControlのカスタムサブクラスを実装したいと思います。私が歯を吐くという致命的な問題を除いて、それは美しく機能します。sendActionsForControlEvents:を使用してアクションメッセージを送信する場合は常に、UIEventを含めることを省略します。たとえば、次のシグネチャを持つメソッドにリンクすると、次のようになります。

- (IBAction) controlTouched:(id)sender withEvent:(UIEvent *)event

...イベントは常にnilとして返されます!この問題はsendActionsForControlEvents内で発生しているようです。

ここで、タッチの場所を判別できるようにするためにIBActionが必要です。私は通常、イベントからタッチを抽出することによってそうします。確かに、正しいイベントが確実に配信されるようにする方法が必要ですか?これは、UIControlを使用する上で非常に基本的な部分です。

法的な回避策を知っている人はいますか?

4

2 に答える 2

5

これは、コントロールイベントを関連付ける必要がある場合はsendActionsForControlEvents:メソッドが認識できないためだと思います。UIEvent

すべてのアクションを個別に送信することを試みることがsendActionsForControlEvents:できるので(ドキュメントに従って、メソッドが行うことを複製します)、それらを具体的にUIEvent:に関連付けることができます。

UIEvent *event = ...;
UIControlEvents controlEvent = ...;

for (id target in [self allTargets]) {
    NSArray *actions = [self actionsForTarget:target forControlEvent:controlEvent];
    for (NSString *action in actions) {
        [self sendAction:NSSelectorFromString(action) to:target forEvent:event];
    }
}
于 2012-07-08T11:49:37.267 に答える
0

現時点で考えられる解決策は1つありますが、あまり満足していません。同じ問題に直面している他の人のために、ここにあります。まず、UIEventのローカル変数またはプロパティを次のように宣言します。

@property (nonatomic, assign) UIEvent * currentEvent;

ここで、タッチ処理ルーチンで、そのローカル変数をそのルーチンの現在のUIEventに設定してから、[self sendActionsForControlEvents:]を呼び出します。もちろん、UIControlEventTouchDownを送信するアクションに置き換えます。

self.currentEvent = event;
[self sendActionsForControlEvents: UIControlEventTouchDown];

最後に、次のメソッドをオーバーライドします。

- (void) sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
{
    [super sendAction:action to:target forEvent:self.currentEvent];
}

これは機能しますが、私はそれが少し好きではないので、UIEventへの弱参照を保持することに依存しない代替ソリューションがあれば、それを聞いて大喜びします!

于 2012-07-08T11:50:43.380 に答える