Для тех из вас, кто работает графически, вот диаграмма иерархии представлений:
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 и отображать на экране.
Как всегда, примеры кода приветствуются. Я добавил свой собственный, чтобы помочь объяснить проблему.