11

我正在使用 Cordova 2.2 for IOS 构建一个 PhoneGap 应用程序。在调用我编写的用于显示 MFMessageComposeViewController 的本机 obj-c 插件时,我遇到了一些奇怪的行为。

设置非常简单 - 我在 UI 元素上附加了一个点击事件,当按下该事件时,将调用我的 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 覆盖看起来很棒,我的值已预先填充。下图展示了插入 XCode 时 SMS 界面看起来很好:

在此处输入图像描述

当我的 iPhone从我的 Mac 上拔下,并且应用程序从弹簧板运行时,覆盖层向上滑动,键盘开始向上滑动,然后立即向下滑动- 使得无法输入或发送消息。这是未连接到 Mac/Xcode 时的样子 - 键盘开始向上滑动然后立即向下滑动(~ < 1 秒),留下以下界面:

在此处输入图像描述

我一生都无法弄清楚当不从 XCode 运行时会导致键盘隐藏的原因,但是当它运行时可以很好地工作。

有没有办法“强制”键盘显示,或者可能以某种形式或方式将整个 modalviewcontroller 作为第一响应者?

任何建议表示赞赏!

编辑:

如果您单击联系人区域,键盘将再次出现

4

4 回答 4

3

您必须添加MessageUI.framework到您的 Xcode 项目并包含一个

#import <MessageUI/MessageUI.h>在你的头文件中。

试试这个代码可能对你有帮助..

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

另请参阅此波纹管教程并检查演示..

  1. 新教程-开发和架构-a-phonegap-应用程序

  2. 短信编辑器

我希望这可以帮助你...

于 2012-12-19T05:34:36.787 回答
2

我在使用 Sencha Touch 2.2 和 Cordova 2.6.0 设置(特别是 iOS 6+ 设备)时遇到了这些症状。

问题在于 Web 框架将焦点从本机 SMS Composer 模式转移,通常发生在第一个 SMS Composer 模式成功显示和关闭之后。

一旦事件被触发(或在 Sencha 土地),Aevent.preventDefault()并调用解决了这个问题。event.stopPropagation()event.stopEvent()

希望这可以帮助,

-詹姆士

于 2013-05-07T15:33:25.510 回答
0

第一:最可能的罪魁祸首,没有看到你的代码,是你的父(呈现)视图控制器可能有一个动作,viewWillDisappear或者viewDidDisappear影响谁拥有“第一”响应者。这些方法在模态显示视图控制器时被调用。由于时序的原因,它在模拟器上的行为可能与设备上的不同 - 通常非常接近的时序条件在 ARM 设备和 i386 处理器上是不同的。

第二:您的应用程序中的任何地方是否注册了UIKeyboardWillShowNotificationUIKeyboardDidShowNotification?如果是这样,请在结果调用的方法中放置断点 - 您的视图层次结构中的其他一些控制器可能会干扰这个控制器。

要回答你的问题...

有没有办法“强制”键盘显示,或者可能以某种形式或方式将整个 modalviewcontroller 作为第一响应者?

对两者都没有。使键盘显示的唯一方法是调用becomeFirstResponder输入视图的方法。由于 Apple 不公开文本视图,因此您无法向其发送消息。设置modalViewController为第一响应者将设置错误的对象。

于 2012-12-21T03:14:32.220 回答
0

我发现了相同类型的问题,但不确定它是否会解决您的问题只需查看以下链接: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

于 2012-12-24T14:22:08.400 回答