我正在使用Cordova 2.2为IOS构建PhoneGap应用程序。当我调用我编写的本机obj-c插件来展示MFMessageComposeViewController时,我遇到了一些奇怪的行为。
设置非常简单 - 我有一个附加到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作为第一响应者?
任何建议都表示赞赏!
修改
如果单击联系区域
,键盘将再次出现答案 0 :(得分:3)
您必须将MessageUI.framework
添加到Xcode项目并添加
#import <MessageUI/MessageUI.h>
在您的标头文件中。
试试这段代码可能对你有所帮助..
[self presentModalViewController:picker animated:YES];
//[self becomeFirstResponder];//try picker also instead of self
另请参阅此下面的教程并查看演示..
答案 1 :(得分:2)
我使用Sencha Touch 2.2和Cordova 2.6.0设置(特别是iOS 6+设备)遇到了这些症状。
问题在于网页框架从原生SMS Composer模式中窃取焦点,通常发生在第一个SMS Composer模式成功显示和关闭之后。
一旦事件被触发({或event.preventDefault()
在Sencha土地上),event.stopPropagation()
和event.stopEvent()
就会解决这个问题。
希望这有帮助,
-James
答案 2 :(得分:0)
首先:最有可能的是,如果没有看到您的代码,您的父(展示)视图控制器可能会在其viewWillDisappear
或viewDidDisappear
中执行操作影响谁拥有“第一”响应者。在以模态方式呈现视图控制器时会调用这些方法。由于时序原因,它在模拟器上的行为可能与设备不同 - 在ARM设备和i386处理器上,通常非常接近的时序条件是不同的。
第二次:您的应用中的任何位置都会注册UIKeyboardWillShowNotification
或UIKeyboardDidShowNotification
吗?如果是这样,将断点放在作为结果调用的方法中 - 视图层次结构中的某些其他控制器可能会干扰这个。
回答你的问题...
有没有办法'强制'键盘显示,或者可能以某种形式或方式将整个modalviewcontroller作为第一响应者?
两者都不。进行键盘显示的唯一方法是调用输入视图的becomeFirstResponder
方法。由于Apple不公开文本视图,因此无法向其发送消息。将modalViewController
设置为第一响应者将设置错误的对象。
答案 3 :(得分:0)
我发现了同样类型的问题但不确定它会解决您的问题或者只是查看以下链接: 1. http://community.phonegap.com/nitobi/topics/keyboard_is_not_triggerd_in_my_ios_build 2. https://github.com/phonegap/build/issues/31
如果不能解决您的问题,那么您可以下载示例代码Here。
链接:https://github.com/phonegap/phonegap-plugins/tree/master/iPhone/SMSComposer