Отсутствует клавиатура в MFMailComposeViewController

У меня этот код хорошо работает в течение нескольких месяцев (на iOS 5.1), но я долго не проверял его, и теперь (вероятно, проблема с iOS 6.0) я заметил, что мой MFMailComposeViewController не показывает клавиатуру, даже когда фокусировка на текстовых полях, таких как тело сообщения или получатели.

Странно то, что он реагирует на нажатия, поэтому я могу установить курсор на «Кому» или «Тема», и курсор появится, или я могу удерживать нажатие, чтобы всплыло зум-стекло. Но без клавиатуры :(

57_45_PM.png" rel="nofollow">СКРИНШОТ ЭТОГО

Вот код, который я использую:

MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init];
mailer.mailComposeDelegate = self;        
[self presentModalViewController:mailer animated:YES];

Я много искал об этом и нашел что-то, что касается
[self resignFirstResponder] или [mailer becomeFirstResponder], но это не сработало.

Если я добавлю этот код до или после представления контроллера

NSLog(@"mailer become %d", [mailer canBecomeFirstResponder]);

Он показывает 0, однако,

NSLog(@"self resign %d", [self resignFirstResponder]);

показывает 1, но до того, как я добавил

- (BOOL)canResignFirstResponder {
    return YES;
}

Документы говорят, что по умолчанию он должен возвращать YES, так что это вдвойне странно.

Если я создаю пустой проект с таким кодом, он работает хорошо, но я не могу этого сделать, потому что мой текущий проект довольно огромен. Любая помощь будет оценена по достоинству, застряв здесь...

Протестировано как на iPhone, так и на симуляторе iOS (обе цели развертывания 5.1 и 6.0)


person dreamzor    schedule 13.12.2012    source источник
comment
Во-первых, если вы все делаете правильно, вы не связываетесь с ответчиками. Я имею в виду, что вместо того, чтобы делать хуже с canBecomeFirstResponder, canResignFirstResponder, becomeFirstResponder и resignFirstResponder, вам нужно найти то, что сделано неправильно, и исправить это. Например, вы можете прекратить использовать устаревший код и заменить его на presentViewController:animated:completion:.   -  person A-Live    schedule 13.12.2012
comment
@ A-Live спасибо за совет, не знал, что он устарел. Поменял, как вы сказали, и все еще не может заставить его работать :(   -  person dreamzor    schedule 13.12.2012
comment
Я могу только предложить проверить, представлено ли это из основного потока (с [[NSThread currentThread] isMainThread]).   -  person A-Live    schedule 13.12.2012
comment
@ A-Live да, он работает из основного потока.   -  person dreamzor    schedule 13.12.2012
comment
На скриншоте нет названия композитора, вы как-то изменили MFMailComposeViewController?   -  person A-Live    schedule 13.12.2012
comment
@A-Live, ему не нужно название, с пустым проектом он работает с клавиатурой и не имеет названия...   -  person dreamzor    schedule 13.12.2012


Ответы (3)


Просто ЛОЛ. Проблема была с

[UIApplication sharedApplication] delegate] window] setWindowLevel:UIWindowLevelStatusBar + 1]

где-то в моем приложении. Кажется, они изменили клавиатуру windowLevel в iOS 6, так что теперь она позади. Мне лень это делать, но было бы интересно узнать точное windowLevel окна клавиатуры :)
Будьте осторожны с этим!

Спасибо всем за помощь в любом случае!

person dreamzor    schedule 13.12.2012
comment
Спасибо, что вернулись с ответом. - person Hot Licks; 13.12.2012
comment
Отличный улов. Это также происходит для MFMessageComposeViewController. - person Stavash; 25.06.2013

Если вы хотите показать клавиатуру, вы должны взять текстовое поле из почтовика, а затем отправить сообщение beFirstResponder.

Тем не менее, нет прямого способа сделать это. При прикосновении к окну сообщения появляется клавиатура?

person ipinak    schedule 13.12.2012
comment
нет, вообще не появляется, даже после прикосновения, вот в чем проблема :( но на прикосновения реагирует синим текстовым курсором и прочее... собираюсь выложить скриншот. - person dreamzor; 13.12.2012

Для других, кто, возможно, столкнулся с этой проблемой клавиатуры в MailComposer, это решение сработало для меня:

  • Представьте представление, затем вызовите «becomefirstResponder» в том же MFMailComposeViewController в методе завершения.

    MFMailComposeViewController* mailCon = [[MFMailComposeViewController alloc] init]; [self presentViewController: mailCon анимированный: НЕТ завершения: ^ { [mailCon beFirstResponder]; }];

person Tope    schedule 05.10.2014