2012-10-08 2 views
3

응용 프로그램 대리인은 Xcode 4.2부터 UIResponder 하위 클래스이므로 터치 및 모션 이벤트를 수신 할 수 있어야합니다. 내 AppDelegate에 수업이 추가하지만 작동하지 않습니다 :AppDelegate에서 흔들기 이벤트를받을 수 있습니까?

-(BOOL)canBecomeFirstResponder 
{ 
    return YES; 
} 

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event { 
    if (motion == UIEventSubtypeMotionShake) { 
     NSLog(@"shake"); 
    } 
} 

그것은 물론 뷰 컨트롤러에서 작업을 수행하지만 탐지 할 응용 프로그램 전반에 흔들립니다.

+0

예, 가능하지만 실제 질문은 ... _app 대리자가 사용자 상호 작용에 응답해야하는 이유를 놓친 것일 수 있습니다 ...? 꽤 이상한 건축물입니다 ... – holex

+1

@holex 흔들기 제스쳐가 앱의 모든 화면에서 작동하기를 원합니다. 예제 사용법 : 흔들어서 스크린 샷을 찍거나 베타 버전으로 의견을보고하십시오. – Felix

답변

0

내가 아는 한, 이벤트를 수신 한 첫 번째 응답자가되어야합니다. 앱에 UINavigationController 또는 UITabController가있는 경우 어쩌면 거기에서받을 수 있습니다.

3

이 작업을 수행 :

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    [self becomeFirstResponder]; 

} 
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event { 

    NSLog(@"motionBegan"); 

} 

-(BOOL)canBecomeFirstResponder { 
return YES; 
} 
+0

나는 이것이 왜 downvoted인지 모른다. 나는이 접근 방식을 시도하고 그것이 작동 (IOS 7) ... 아무도 이것이 어떤 문제를 일으킬 수 있는지 안다? – JakubKnejzlik

+0

나에게도 완벽하게 일했습니다! 감사! –

2

을 내가 확장 UiApplication 클래스 및 추가 클래스 참조 주에 : MyApplication.h

@interface MyApplication : UIApplication 

@end 

MyApplication.m

@implementation MyApplication 

- (void) sendEvent:(UIEvent *)event 
{ 
    if(event && (event.subtype==UIEventSubtypeMotionShake)) 
    { 
     AppDelegate *objAppDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate; 

     [objAppDelegate doWhatEver]; 
     [super sendEvent:event]; 
    } 
    else 
    { 
     [super sendEvent:event]; 
    } 
} 

@end 

그리고 마지막 단계 main.m에서

int main(int argc, char *argv[]) 
{ 
return UIApplicationMain(argc, argv, NSStringFromClass([MyApplication class]), NSStringFromClass([AppDelegate class])); 
} 

모든 경우에 적용됩니다.

관련 문제