2012-04-20 8 views
1

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

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

しかし、アクションが完了したときに通知する必要があります。つまり、アクションが完了するまで待つ必要があります。私はイベント [:FIRE_EVENT_NOTIFICATIONオブジェクト:[NSNotificationCenter defaultCenter] postNotificationName自己]を上げるためにNSNotificationCenter

//を使用して考えていました。

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

私はCategoriesまたは を使用することを考えています。したがって、私はobjc_msgSendを待つことが何時でもあり、どこで続けるべきかわかりません。

答えて

1

あなたがやろうとしていることとあなたが抱えている問題は完全にはっきりしていませんが、あなたの質問に答えていくつもりです。

私が正しく理解しているのであれば、ボタンのようなUI要素に関連付けられたアクションを実行しようとしています。要素への参照がelementであり、要素targetに関連付けられたactionを呼び出すとします。以下は、アクションがIBActionであることを前提としています。

これを実行する最も簡単な方法は、おそらく次のようになります。

[element.target performSelector:element.action]; 

注:element.actionはほぼ確実SEL(セレクタ)ないNSStringを返すのでNSSelectorFromString()を通してそれを実行する必要はありません。方法保存するためには何もありませんので、

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

IBActionさんは、戻り値はありません:パラメータはので、私はあなたがやりたいかもしれないと思うよう

通常は、IBActionイベントは、要素上でクリック受け取ることになります戻る。

performSelector:およびperformSelector:withObject:は、呼び出されたメソッドが完了するまで実行されます。完了したアクションの通知を整理する必要はありません。

ただし、呼び出しているアクションが別のスレッド上のコードを起動している場合、ボタンを押した結果が完了する前に呼び出されるアクションが返される可能性があります。これは実行されているコードを知らなくても監視するのが難しいでしょう。performSelector:同様

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

と呼ばれる方法が完了するまで実行したときに、objc_msgSendだけ返します。何らかの理由で、あなたは、あなたが以下のように使用するobjc_msgSendを使用するを持っている、場合

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

関連する問題