Приложение не падает из-за событий встряхивания. Я только что создал небольшой тестовый проект с таким кодом:
- (BOOL)canBecomeFirstResponder
{
return YES;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self becomeFirstResponder];
}
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
if(motion == UIEventSubtypeMotionShake)
{
NSLog(@"Shake is working");
}
}
Это ведет себя правильно. Я бы предложил закомментировать код встряхивания и заменить его простым NSLog, чтобы убедиться, что встряска работает правильно, а затем работать над этим, тестируя один фрагмент за раз.
Кроме того, в вашем коде viewDidDisappear я бы изменил порядок этих двух строк кода. (Почти) всегда, сначала делайте вызовы [super ..].