1

私はObjective-Cでメタプログラミングを行っており、アプリケーション機能の一部を自動化しようとしています。したがって、アプリケーションのソースコードファイルとビューコントローラーを変更するのではなく、UIナビゲーションスタックを取得するために管理している別のファイルから、Objective-Cランタイムリファレンスを使用してタップ可能なUI要素とアクションを検索しています。たとえば、ボタンの場合、ターゲットとアクションを見つけ、objc_msgSendを呼び出してプログラムでイベントを発生させます。

ステップ=(NSObject *)objc_msgSend(element.target、NSSelectorFromString(element.action));

ただし、アクションが完了したときに通知を受ける必要があります。つまり、アクションが完了するまで待ってから自動化を続行する必要があります。NSNotificationCenterの使用を考えていました

//イベントを発生させる[[NSNotificationCenterdefaultCenter]postNotificationName:FIRE_EVENT_NOTIFICATION object:self];

しかし、働いているようには見えません。

カテゴリを使用することも考えているので、objc_msgSendを待つ必要があるかどうか、どこに進むべきかわかりません。

4

1 に答える 1

1

あなたが何をしようとしているのか、そしてあなたが抱えている正確な問題は完全には明らかではありませんが、私はあなたの質問に答えるつもりです。

私が正しく理解していれば、UI要素に関連付けられたアクション(おそらくボタンを押すようなもの)を実行しようとしています。の要素への参照があり、要素に関連付けられているelementを呼び出したいと考えています。以下は、アクションがであると想定しています。actiontargetIBAction

これを行う最も簡単な方法は、おそらく次のとおりです。

[element.target performSelector:element.action];

注: ほぼ確実に(セレクター)をelement.action返すのではなく、を実行する必要はありません。SELNSStringNSSelectorFromString()

通常、IBActionイベントはクリックされた要素をパラメーターとして受け取るので、次のことを行うとよいと思います。

[element.target performSelector:element.action withObject:element];

IBActionには戻り値がないため、メソッドが戻ったときに保存するものはありません。

performSelector:呼び出されperformSelector:withObject:たメソッドが完了するまで実行された場合にのみ戻ります。アクションの完了に関する何らかの通知を整理する必要はありません。

ただし、呼び出しているアクションが別のスレッドでコードを起動している場合は、ボタンを押した結果が完了する前に、呼び出されたアクションが戻る可能性があります。これは、実行されているコードの知識がないと監視が困難になります。

何らかの理由で使用する必要がある場合objc_msgSend、次を使用します。

objc_msgSend(element.target, element.action, element);

のようperformSelector:objc_msgSend、呼び出されたメソッドが完了するまで実行された場合にのみ戻ります。

うまくいけば、私はあなたの質問を理解し、私の答えは理にかなっています、しかし私が間違った木を吠えている可能性は完全にあります。

于 2012-04-21T05:51:54.383 に答える