2013-03-11 2 views
1

Я тестировал это как на iPad, так и на iPad Simulator, и после одного успешного встряхивания метод motionBegan никогда не вызывается. Ниже приведен фрагмент моей программы.Shake больше не работает после UIAlertview

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event 
{ 
    if(event.type == UIEventSubtypeMotionShake) 
    { 
    NSLog(@"Shake event occurred."); 

      UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Information" message:@"Some message here" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil]; 
      alert.tag = shakeTag; 
      [alert show]; 

    } 
} 

- (BOOL)canBecomeFirstResponder 
{ 
return YES; 
} 

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:NO]; 
    [self becomeFirstResponder]; 
} 

-(void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:NO]; 
} 

-(void)viewDidDisappear:(BOOL)animated { 
    [self resignFirstResponder]; 
    [super viewDidDisappear:NO]; 
} 

Что именно предотвращает появление метода motionBegan? Я хотел бы, чтобы UIAlertView был представлен ровно один раз для первого встряхивания и уволен за все последующие тряски. У меня есть догадка о том, что первый ответчик по-прежнему привязан к UIAlertView, который не позволяет снова вызвать метод motionBegan.

Обновление: В моем соответствующем UIView создается созданный файл UIActionSheet. который вызывается и реализуется в моем UIView), и я запускаю метод motionBegan (который находится в моем UIViewController) в то же самое время, которое отображается на экране UIActionSheet, проблема, когда метод motionBegan больше не может быть вызван.

Впоследствии UIAlertView уволен с любого выбора кнопки, метод motionBegan больше не вызывается, но UIActionSheet работает отлично. В UIView нет назначения firstResponder, и в UIViewController существует только «canBecomeFirstResponder». Есть идеи?

+0

Я скопировал и вставил ваш код, и он неоднократно работал на симуляторе iPad (единственное, что я вынул, это строка alert.tag = shakeTag). – rdelmar

+0

@rdelmar Это не работает для меня на симуляторе iPAD. Жест аппаратного дрожания больше не вызывает motionBegan, так как есть только один вывод следующей строки: «NSLog (@« Событие Shake произошло »); У меня есть следующий метод обработки этого конкретного тега предупреждения: «- (void) alertView: (UIAlertView *) alertView clickedButtonAtIndex: (NSInteger) buttonIndex« – David

+0

Ну, я понятия не имею, почему ваш не работает. Я добавил тег и метод делегата alert, и он все еще отлично работает для меня. – rdelmar

ответ

1
  1. Поскольку этот код находится в вашем представленииController, удалите все материалы, относящиеся к цепочке ответчиков. На самом деле это вам не нужно. Это делается автоматически для вас. Более точно можно удалить:

    - (BOOL)canBecomeFirstResponder // remove all that method 
    { 
    return YES; 
    } 
    
        [self becomeFirstResponder]; // remove this line 
    
    ... 
        [self resignFirstResponder]; // remove this line 
    ... 
    

    и удалить это, а все, что методу

    -(void)viewWillDisappear:(BOOL)animated { 
        [super viewWillDisappear:animated]; 
    } 
    
  2. Позвоните своему alertView материал в motionEnd вместо motionBegan. Могло быть и лучше.

+0

Что конкретно связано с цепочкой ответчиков? – David

+0

Я обновил ответ Дэвид. –

+0

Поняли, спасибо! – David

Смежные вопросы