2012-04-20 86 views
1

我正在用Objective-C進行元編程,並嘗試自動化一些應用程序功能。因此,我並沒有改變應用程序的源代碼文件和視圖控制器,而是從另一個文件中獲取UI導航堆棧,我正在使用Objective-C Runtime Reference來查找可點擊的UI元素和操作。例如對於一個按鈕,我找到了目標和動作,並調用objc_msgSend以編程方式觸發事件。步驟=(NSObject *)objc_msgSend(element.target,NSSelectorFromString(element.action));步驟2(NSObject *)objc_msgSend(element.target,NSSelectorFromString(element.action));如何在調用objc_msgSend後繼續

但是,當動作完成後,或者換句話說,我需要等待動作完成後才能繼續自動化。我想用NSNotificationCenter

//引發一個事件 的[NSNotificationCenter defaultCenter] postNotificationName:FIRE_EVENT_NOTIFICATION對象:自我]。

但看起來不像是工作。

我甚至想用Categories或 所以我不知道是否有反正等待objc_msgSend,我應該繼續。

回答

1

這是不完全清楚你正在做什麼,以及你有什麼確切的問題,但我會去回答你的問題。

如果我理解正確,您正在嘗試觸發與UI元素關聯的操作,推測可能是按按鈕。您可以參考element中的元素,並且您想要調用元素target上的關聯action。以下假設採取的行動是IBAction

做到這一點大概是最簡單的方法:

[element.target performSelector:element.action]; 

注:element.action幾乎肯定會返回一個SEL(選擇)不是一個NSString所以沒有必要通過NSSelectorFromString()運行它。

通常情況下,IBAction事件將獲得點擊的元素作爲一個參數,所以我想你可能想要做的:

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

IBAction的沒有返回值,以便有什麼存儲方法時回報。

performSelector:performSelector:withObject:只會在調用方法運行完成後纔會返回。你不需要組織某種完成動作的通知。

但是,如果您正在調用的動作是在另一個線程上啓動代碼,那麼在按下按鈕的結果完成之前被調用的動作可能會返回。如果不知道正在運行的代碼,這將很難監控。

如果由於某種原因,你使用objc_msgSend那麼你可以使用下列內容:

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

performSelector:,當調用方法已經完成運行objc_msgSend只會返回。

希望我已經理解了你的問題,我的答案是有道理的,但我完全有可能吠叫錯誤的樹。