Отображение клавиатуры затем сразу же скрывается при показе MFMessageComposeViewController

Я создаю приложение PhoneGap с использованием Cordova 2.2 для IOS. Я сталкиваюсь с каким-то странным поведением при вызове плагина obj-c, который я написал, чтобы показать MFMessageComposeViewController.

Настройка очень проста - у меня есть событие крана, прикрепленное к элементу пользовательского интерфейса, которое при нажатии вызывает вызов моего плагина PhoneGap, передает ему номер и текстовое сообщение, а затем показывает MFMessageComposeViewController с параметрами предварительно заполненные.

Мой javascript выглядит следующим образом:

$(document).bind('deviceready', function(){ 

    $(".theButton").tap(function(){     

        cordova.exec(function(){}, function() {}, "PhoneGapSms", "SendSms", [db.getItem("profile_sms"), db.getItem("profile_emergency")]);

    }); 
});

И мой код obj-c выглядит так:

- (void)SendSms:(CDVInvokedUrlCommand*)command
{

    CDVInvokedUrlCommand* myCommand = command;

    MFMessageComposeViewController *picker = [[MFMessageComposeViewController alloc] init];

    NSString* body = [command.arguments objectAtIndex:0];
    NSString* toRecipientsString = [command.arguments objectAtIndex:1];

        if(body != nil)
            picker.body = body;

        if(toRecipientsString != nil)
            [picker setRecipients:[ toRecipientsString componentsSeparatedByString:@","]];


    picker.messageComposeDelegate = self;

    [self.viewController presentModalViewController:picker animated:YES];
    [[UIApplication sharedApplication] setStatusBarHidden:YES];


    [picker release];

}

Итак, в целом, очень простой материал.

Моя проблема такова:

Когда мой iPhone подключен к моему Mac и приложение запускается с XCode, наложение Message Composer выглядит великолепно, мои значения предварительно заполнены. На рисунке ниже показано, что интерфейс SMS отображается нормально, когда подключен к XCode:

enter image description here

Когда мой iPhone отключен от моего Mac, а приложение запускается с панели spring, наложение слайдов вверх, клавиатура начинает скользить вверх, , а затем сразу переходит вниз - невозможность ввода или отправки сообщения. Это то, на что похоже, когда он не привязан к Mac/Xcode - клавиатура начинает скользить вверх, а затем сразу сдвигается вниз (~ < 1 с), оставляя следующий интерфейс:

enter image description here

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

Есть ли способ "заставить" клавиатуру отображать или, возможно, поставить весь modalviewcontroller в качестве первого ответчика в какой-либо форме или моде?

Любые предложения приветствуются!

Edit:

Клавиатура снова появится, если вы нажмете в области контакта

Ответ 1

Вы должны добавить MessageUI.framework в свой проект Xcode и включить

#import <MessageUI/MessageUI.h> в вашем файле заголовка.

попробуйте этот код, возможно, вам будет полезно.

[self presentModalViewController:picker animated:YES];
//[self becomeFirstResponder];//try picker also instead of self

Также см. этот ниже учебник, а также проверьте демо.

Надеюсь, это поможет вам...

Ответ 2

Я столкнулся с этими симптомами с помощью установки Sencha Touch 2.2 и Cordova 2.6.0 (в частности, устройств iOS 6+).

Проблема заключалась в том, что веб-фреймворк уклонялся от родного SMS Composer modal, обычно возникавшего после того, как первый SMS Composer был успешно отображен и закрыт.

A event.preventDefault() и event.stopPropagation() вызов после того, как событие было уволено (или event.stopEvent() на земле Сенча) разрешило это.

Надеюсь, что это поможет,

-Джеймс

Ответ 3

Первый. Самый вероятный виновник, не видя ваш код, заключается в том, что ваш родительский (представляющий) контроллер представления может иметь действие в своих viewWillDisappear или viewDidDisappear, которые влияют на тех, у кого есть "первый" ответчик. Эти методы вызывают при представлении контроллера вида по модулю. Это может вести себя по-разному на симуляторе, чем устройство из-за синхронизации - часто очень близкие условия синхронизации различаются на устройстве ARM и процессоре i386.

Второй. В любом месте вашего приложения регистрируется UIKeyboardWillShowNotification или UIKeyboardDidShowNotification? Если это так, поместите точки останова в методы, которые вызывают в результате - возможно, какой-то другой контроллер в вашей иерархии представлений вмешивается в это.

Чтобы ответить на ваш вопрос...

Есть ли способ "заставить" клавиатуру отображать или, возможно, поставить весь modalviewcontroller в качестве первого ответчика в какой-либо форме или моде?

Нет для обоих. Единственный способ сделать дисплей клавиатуры - вызвать метод becomeFirstResponder для представления ввода. Поскольку Apple не раскрывает текстовое представление, вы не можете отправлять ему сообщения. Установка modalViewController в качестве первого ответчика будет устанавливать неправильный объект.

Ответ 4

Я нашел тот же тип проблемы, но не уверен, что это решит вашу проблему или не просто взгляните на следующие ссылки:  1. http://community.phonegap.com/nitobi/topics/keyboard_is_not_triggerd_in_my_ios_build  2. https://github.com/phonegap/build/issues/31

Если это не решение вашей проблемы, вы можете загрузить пример кода здесь.

Ссылка: https://github.com/phonegap/phonegap-plugins/tree/master/iPhone/SMSComposer