【问题标题】:Keyboard shows then immediately hides itself when showing MFMessageComposeViewController键盘显示然后在显示 MFMessageComposeViewController 时立即隐藏自身
【发布时间】:2012-12-02 19:23:55
【问题描述】:

我正在使用 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 上拔下电源并从弹力板运行应用程序时,Overlay 向上滑动,键盘开始向上滑动,然后立即向下滑动 strong> - 无法输入或发送消息。这是未连接到 Mac/Xcode 时的样子 - 键盘开始向上滑动,然后立即向下滑动(~

我这辈子都想不通是什么原因导致键盘在不从 XCode 运行时会隐藏起来,但在它运行时却可以很好地工作。

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

欢迎提出任何建议!

编辑:

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

【问题讨论】:

    标签: iphone objective-c ios xcode cordova


    【解决方案1】:

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

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

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

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

    另请参阅下面的教程并查看演示..

    1. new-tutorial-developing-and-architecting-a-phonegap-application

    2. SMSComposer

    希望对你有帮助……

    【讨论】:

    • @Evan 试试这个答案,如果有任何疑问,请发表评论.. 希望你明白了.. :)
    • @Evan 用过这个教程吗??也只是将流程从 viewcontroller 更改为 navigationcontroller 老兄......
    • 如果他不导入 MessageUI 框架,我认为他无法实例化 MFMessageComposeViewController...
    • @Evan 还看到这个插件老兄,我认为上面的链接是最好的,而且这个插件有一个选项,你可以从中得到一些想法。github.com/purplecabbage/phonegap-plugins .. 只是改变一些代码,它会正常工作:)
    【解决方案2】:

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

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

    事件触发后,event.preventDefault()event.stopPropagation() 调用(或 Sencha 领域中的 event.stopEvent())解决了这个问题。

    希望这会有所帮助,

    -詹姆斯

    【讨论】:

    • 这是绝妙的侦查和有效的解决方案。我可以确认它适用于 iOS 6+ 上的 Sencha Touch 2.2.0 和 Cordova 2.3.0。你是怎么得出这个答案的?我什至不知道如何解决它。
    【解决方案3】:

    第一:最可能的罪魁祸首是,在没有看到您的代码的情况下,您的父(呈现)视图控制器可能在其viewWillDisappearviewDidDisappear 中具有影响谁拥有“急救人员。这些方法在模态显示视图控制器时被调用。由于时序的原因,它在模拟器上的行为可能与设备上的不同 - 通常非常接近的时序条件在 ARM 设备和 i386 处理器上是不同的。

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

    回答你的问题...

    有没有办法“强制”键盘显示,或者可能以某种形式或方式将整个 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

    如果它不能解决您的问题,那么您可以下载示例代码Here

    链接:https://github.com/phonegap/phonegap-plugins/tree/master/iPhone/SMSComposer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多