2012-05-13 81 views
0

我在視圖控制器中放置了motionBegan:withEvent:方法,以查看它是否可以工作,但未被調用。在viewWillAppear中,我讓視圖控制器成爲第一響應者,並從canBecomeFirstResponder返回YES。將搖動手勢事件傳遞給應用程序代理

此視圖控制器位於分割視圖的主窗格中,因此也許在我搖動設備之前更改了第一個響應者。

但我真正的問題是如何將所有運動事件傳遞給我的應用程序委託中的處理程序?我是否真的必須擁有motionBegan:withEvent:所有視圖控制器中的方法或委託給所有第一響應者?沒有一種方法可以讓事件像這樣流入響應者鏈而無需將代碼插入每個UIResponder?似乎會有,但我沒有把手指放在如何做到這一點上。

回答

1

最簡單的方法是覆蓋UIApplication-sendEvent:那麼你將不得不控制研究過的所有事件

,你可以使用這個類

int retVal = UIApplicationMain(argc, argv, @"myApplication", @"myAppDelegate"); 

另一種解決方案是讓類別或擴大-viewWillAppear:more info

+0

感謝您展示UIApplication類和UIApplicationMain函數如何與此綁定。這是一個我不熟悉的領域,看起來它非常有用。如果我理解了這個權利(今晚我會試試它),那麼在UIApplication的子類中,我可以攔截所有發生在'sendEvent :',對那些我想要立即解決的問題採取行動(如搖動),然後爲那些應該進行正常處理的人調用[super sendEvent:event]。 – Jim

+0

UIApplication的子類很完美。對於任何感興趣的人,即使設備在用戶口袋裏,搖晃事件也可能發生。一些額外的過濾將是必要的。 – Jim

0

我在傳遞過程中所做的是創建一個實現了motionBegan方法的UIWindow類。在那個motionBegan方法中,我廣播了一個自定義的NSNotification。然後,在需要運動事件的應用程序中的任何地方,只需添加一個觀察者以用於運動通知。

由於類將方法添加到每個對象的實例,所以即使系統創建的窗口也會獲取您的motionBegan方法,並執行正確的操作。它的作品非常漂亮。

+0

我不確定這是如何工作的,如果UIWindow不是firstResponder的委託。 motionBegan:是firstResponder的UIRespopnder(或子類UIResponder)對象的委託中的一種方法。這可能並非總是如此(通常不是,我打賭。)我錯了嗎? – Jim

相關問題