UITextField останавливает событие встряхивания? - PullRequest
0 голосов
/ 25 мая 2010

Для тех из вас, кто работает графически, вот диаграмма иерархии представлений:

Root View -> UINavigationController -> UITableView -> Edit View -> Problem UITextfield

По сути, - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event; вызывается в моем Root View при встряхивании устройства.

Когда пользователь нажимает на значок «редактировать» (ручка, в нижней части экрана, а не традиционная кнопка редактирования UINavigationBar), основной вид добавляет подпредставление к себе и анимирует его на экране с помощью пользовательского анимация.

Это подпредставление содержит UINavigationController, который содержит UITableView. UITableView, когда ячейка нажата, загружает подпредставление в себя. Это второе подпредставление является виновником. По какой-то причине UITextField в этом втором подпредставлении вызывает проблемы.

Когда пользователь нажимает на вид, основной вид не будет реагировать на колебания, если UITextField не активен (в режиме редактирования?).

Дополнительная информация:

Обработчик событий My Motion:

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {
 NSLog(@"%@", [event description]);
 SystemSoundID SoundID;
 NSString *soundFile = [[NSBundle mainBundle] pathForResource:@"shake" ofType:@"aif"];
 AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:soundFile], &SoundID);
 AudioServicesPlayAlertSound(SoundID); 
 [self genRandom:TRUE];
}

Метод genRandom::

/* Generate random label and apply it */
-(void)genRandom:(BOOL)deviceWasShaken{
 if(deviceWasShaken == TRUE){
  decisionText.text = [NSString stringWithFormat: (@"%@", [shakeReplies objectAtIndex:(arc4random() % [shakeReplies count])])];
 }else{
  SystemSoundID SoundID;
  NSString *soundFile = [[NSBundle mainBundle] pathForResource:@"string" ofType:@"aif"];
  AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:soundFile], &SoundID);
  AudioServicesPlayAlertSound(SoundID);
  decisionText.text = [NSString stringWithFormat: (@"%@", [pokeReplies objectAtIndex:(arc4random() % [pokeReplies count])])];
 }
}

shakeReplies и pokeReplies являются NS-массивами строк. Один используется, когда тыкают определенную часть экрана, а другой - когда устройство встряхивается. Приложение будет случайным образом выбирать строку из NSArray и отображать на экране.

Как всегда, примеры кода приветствуются. Я добавил свой собственный, чтобы помочь объяснить проблему.

Ответы [ 2 ]

1 голос
/ 25 мая 2010

попробуйте использовать [self.view endEditing:YES];

и для клавиатуры, которая должна быть стеклянной:

[textfield setKeyboardAppearance:UIKeyboardAppearanceAlert];

Надеюсь, это поможет. Спасибо, Madhup

1 голос
/ 25 мая 2010

Клавиатура: Ищите UIKeyboardAppearanceAlert

Что касается обнаружения дрожания. Как только UITextField уходит в отставку первым респондентом (не в фокусе, клавиатура скрыта), вам нужно убедиться, что другой UIResponder в цепочке становится firstResponder. Например, если у вас есть кнопка, которая отправляет -resignFirstResponder в текстовое поле, вам нужно сделать это:

- (IBAction)pressButton {
    [textField resignFirstResponder];
    [self becomeFirstResponder];
}
...