2013-01-18 139 views
5

如何發送UILongPressGesture消息給對象?如何以編程方式發送UILongPressGesture?

我知道如何發送觸摸,但不是手勢。例如,如果我想送觸摸我可以使用:

[button sendActionsForControlEvents: UIControlEventTouchUpInside]; 

和按鈕將會收到「潤色裏面」。我需要用長按手勢做同樣的事情。

認爲自動UI測試。調用與手勢相關的選擇器並不會有意義地測試任何東西。

+0

你是什麼意思的「消息對象」? – iProgrammed

+0

@iProgrammed請參閱我的重寫問題的澄清。 –

回答

7

導入<UIKit/UIGestureRecognizerSubclass.h>並手動將state屬性設置爲適合您需要模擬的狀態序列。這會導致添加的目標/操作對被調用。每次手動設置狀態後,都必須讓run循環運行,以便分派消息。

對於UILongPressGestureRecognizer,如手勢的實際,「觸摸,按住,拖動,釋放」序列被發現得到國家的正確順序,我寫了一個UIViewController子類下面的代碼裏面viewDidLoad

UILongPressGestureRecognizer *r = [[UILongPressGestureRecognizer alloc] init]; 
[self.view addGestureRecognizer:r]; 
[r addTarget:self action:@selector(recognize:)]; 
r.state = UIGestureRecognizerStateBegan; 
[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; 
r.state = UIGestureRecognizerStateChanged; 
[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; 
r.state = UIGestureRecognizerStateEnded; 
[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; 
[r reset]; 

我想這在生產代碼中會有風險(您可能希望事先調用reset但我在測試中發現沒有區別),但是如果您的用例是自動測試以驗證目標並且已經正確設置了操作,這可能會滿足您的需求。

+0

我仍然有一些計時問題需要解決,但這使我走上了正確的軌道(並且肯定地回答了這個問題)。謝謝! –

0

你知道對象與其UILongPressGestureRecognizer有什麼關聯嗎?如果你知道的話,你可以稱它。如果你問是否有像touchesMoved:(UITouch *)touch這樣的方法,那麼答案是否定的。

+0

像'[按鈕sendActionsForControlEvents:UIControlEventTouchUpInside]',但是用手勢而不是觸摸事件。你在第二句話中說不,不可能嗎? –

相關問題