2012-01-29 3 views
2

나는 (내가 더 나은 방법이있을 경우를 대비하여) 일반적으로하고 싶은 것을 설명하고 내가 실행 한 걸림돌을 설명 할 것입니다. 방법).언제 NSUndoManager의 경고보기를 볼 수 있습니까?

내가 원하는 작업 : 제한 시간이있는 실행 취소 관리자에 호출을 추가하고 싶습니다. 시간 제한 내에서 실행 취소가 실행되지 않으면 장치가 흔들릴 때 사용할 수 없으므로 아무 것도 일어나지 않습니다.

내가하는 일 : 내 접근 방식은 NSUndoManagerNSTimer과 함께 사용했습니다. 실행 취소 관리자에 호출을 추가하면 5 초 타이머도 시작됩니다. 타이머가 실행되면 !self.undoManager.isUndoing을 확인하고 그것이 참이라면 실행 취소 관리자에서 모든 작업을 제거합니다. 시뮬레이터에서 테스트하면 흔들기 동작이 5 초 전에 실행 취소를 시작하지만 이후에는 실행되지 않습니다.

문제는 내가 오초 제한에서 악수 제스처를 얻을 경우, 실행 취소 관리자가 경고를 보여주고 있다는 것입니다,하지만 실제로 실행 취소 버튼을 탭에 사용자가 5 초 제한이 끝날 때까지를 기다리는 경우 아무 일도 발생하지 않습니다 다음은 타이머가 알람보기가 표시 되더라도 행복하게 스택을 지 웁니다.

경고보기가 표시되는지 확인하고 확인할 수있는 방법이 있습니까? 사용자가 실행 취소 또는 취소 버튼을 눌렀는지 파악하고 취소 버튼을 누르면 실행 취소 관리자의 작업 스택을 지우는 것이 가장 좋습니다.

또는이 방법으로 타이머를 사용하는 것 외에 다른 방법이 있습니까?

감사합니다. 추가

편집 : 내 다른 생각합니다 (motionEnded:withEvent: 전화를 통해) 흔들림 이벤트 나 자신을 포착하고 수동으로 경고를 관리하고 스택을 취소했다. 위와 비교 한 생각도 환영합니다.

+1

나는 motionEnded : withEvent 메서드를 사용하는 것이 최선의 방법이라고 생각한다. UIAlertView는 기본적으로 UIWindow이며, 주 앱의 창이 다시 키가 될 때를 확인할 수 있으므로 실행 취소 경고보기가 해제되었음을 알 수 있습니다. –

+0

흠, 좋은 지적입니다. 나는 모션으로 끝낼 것 같아. 끝내주는 것. 작동하는 경우 여기 다시 대답하겠습니다. 감사! – kevboh

답변

0

편집 내용에서 제안한대로 motionEnded:withEvent을 사용하여 경고를 수동으로 관리하고 실행 취소했습니다. 단점은 UIAlertView과 약간 다른 스타일의 내장 된 실행 취소 알림을받지 못하고 흔들리는 동작으로 화면에 들어가는 것입니다.

최대 단점은 이제 10 초 후에 만료가 취소된다는 것입니다. 다음은 동일한 코드를 원할 경우 코드의 일반적인 구조입니다.

먼저 make sure your app can receive shake events이며 NSUndoManager이 있습니다. 타이머가 필요합니다. 실행 취소 가능한 이벤트가 발생하고 10 초간 지속될 때 실행되는 코드는 NSTimer입니다. 실행 취소 대상을 타이머가 시작되는 동일한 타이머에 추가하여 실제로 실행 취소 할 항목이 있는지 확인하십시오.

다음과 같이 motionEnded:withEvent을 구현 : 내 경고가 화면에 있는지 추적하기 위해 여기 undoAlertIsVisible_라는 아이바를 사용하고

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event { 
    if (motion == UIEventSubtypeMotionShake && [self.undoManager canUndo]) { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Undo something?" message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Undo", nil]; 
     [alert show]; 
     undoAlertIsVisible_= YES; 
    } 
} 

. 우리는 우리가 현재 실행 취소하지 않는 및 경고가 표시되지 확인 여기

if (!self.undoManager.isUndoing && !undoAlertIsVisible_) { 
    // Clear away the possible undo 
    [self.undoManager removeAllActionsWithTarget:self]; 
} 
undoTimer_ = nil; 

: 당신의 타이머의 콜백에서

는, 그런 짓을.그렇다면 실행 취소 작업을 제거하고 타이머 (다른 ivar)를 nil로 설정하십시오. 우리가 하나가 타이머가 동시에 발사되면 취소가 발생하거나 확인 알림 콜백에서

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if (buttonIndex != alertView.cancelButtonIndex) { 
     if (self.undoManager.canUndo) { 
      [self.undoManager undo]; 
     } 
    } 
    else { 
     if (!undoTimer_) { 
      // Timer fired while we were staring at the alert 
      [self.undoManager removeAllActionsWithTarget:self]; 
     } 
    } 
    undoAlertIsVisible_= NO; 
} 

: 나는 여기에 내 경고 콜백, 해고인지 확인할 수 있도록 나는 무기 호에 타이머를 설정하고있어 경고가 표시되고 경고가 취소 된 경우 실행 취소 작업을 취소 할 수 있습니다. 그렇지 않으면 실행 취소 작업은 타이머를 사용하지 않고 취소 한 후에 취소됩니다.

희망이 있으면 도움이됩니다.