Phonegap iOS6:删除表单助手栏的正确解决方案(上一步,下一步,完成)

时间:2012-12-13 00:17:41

标签: jquery iphone c cordova keyboard

另一个“如何删除前,下,完成按钮”-question 你可能会认为。实际上并非如此。我已经对此做了一些相当彻底的研究并尝试了不同的方法,但没有方法或解决方案似乎真的做得不错。下面提到和显示的所有解决方法(它们就是这些)基本上是相同的方法,替换MainViewController.m 文件的内容。我很清楚,所有这些提议的解决方案或多或少都有些 hacky 但是,仍然应该有那些以一点优雅和深刻的思想解决这个问题的人,或者了解C井的人,可以提出更可靠的解决方案。

请允许我通过参考一些提议的解决方案来说明我的观点:

Solution 1

在iOS6中,这会导致表单助理栏边框仍然存在,键盘的行为就像表格助手栏还在那里一样。

Solution 2

有人提出了上述解决方案,但我根本无法使其发挥作用。回答者对帖子进行了多次编辑和评论,只是更难以掌握在哪里做什么。我已尝试过他的解决方案的所有变体,但我总是得到一个严重的错误,项目只是不会编译

Solution 3

不是C程序员(这就是我使用phonegap的原因)所以无法让它正常工作。不知道添加什么

Solution 4

不知道在何处以及如何实施所以没有尝试过。我应该在哪里注册以接收keyboardDidShow通知?我应该在哪里添加功能?

结论

根据我的研究,如果你愿意的话,还没有人提出适当的解决方案。那么有没有人成功地删除了表格助手而没有任何上述副作用?

6 个答案:

答案 0 :(得分:7)

在这里,我在我正在开发的应用程序中使用它。手指越过它进入应用程序商店,虽然进入其他“黑客”进入商店这并不比其他人差,所以应该有一个公平的机会。

这种方法没有令人讨厌的副作用 - 它通过确保它从未在第一时间创建而干净地移除了它。塔达!

信用转到https://gist.github.com/2048571,这是他的代码,只有一个小修复。

#import <objc/runtime.h>
#import <UIKit/UIKit.h>

@interface UIWebView (HackishAccessoryHiding)
@property (nonatomic, assign) BOOL hackishlyHidesInputAccessoryView;
@end

@implementation UIWebView (HackishAccessoryHiding)

static const char * const hackishFixClassName = "UIWebBrowserViewMinusAccessoryView";
static Class hackishFixClass = Nil;

- (UIView *)hackishlyFoundBrowserView {
    UIScrollView *scrollView = self.scrollView;

    UIView *browserView = nil;
    for (UIView *subview in scrollView.subviews) {
        if ([NSStringFromClass([subview class]) hasPrefix:@"UIWebBrowserView"]) {
            browserView = subview;
            break;
        }
    }
    return browserView;
}

- (id)methodReturningNil {
    return nil;
}

- (void)ensureHackishSubclassExistsOfBrowserViewClass:(Class)browserViewClass {
    if (!hackishFixClass) {
        Class newClass = objc_allocateClassPair(browserViewClass, hackishFixClassName, 0);
        IMP nilImp = [self methodForSelector:@selector(methodReturningNil)];
        class_addMethod(newClass, @selector(inputAccessoryView), nilImp, "@@:");
        objc_registerClassPair(newClass);

        hackishFixClass = newClass;
    }
}

- (BOOL) hackishlyHidesInputAccessoryView {
    UIView *browserView = [self hackishlyFoundBrowserView];
    return [browserView class] == hackishFixClass;
}

- (void) setHackishlyHidesInputAccessoryView:(BOOL)value {
    UIView *browserView = [self hackishlyFoundBrowserView];
    if (browserView == nil) {
        return;
    }
    [self ensureHackishSubclassExistsOfBrowserViewClass:[browserView class]];

    if (value) {
        object_setClass(browserView, hackishFixClass);
    }
    else {
        Class normalClass = objc_getClass("UIWebBrowserView");
        object_setClass(browserView, normalClass);
    }
    [browserView reloadInputViews];
}

@end

答案 1 :(得分:7)

对于仍在努力解决这个问题的人来说,Phonegap现在有两个属性可用于禁用表单附件栏问题以及输入和文本区域字段触发键盘时页面滚动的问题。

只需在config.xml中设置以下内容即可。

<preference name="HideKeyboardFormAccessoryBar" value="true" />
<preference name="KeyboardShrinksView" value="true" />

链接到Phonegap Documentation

答案 2 :(得分:2)

在任何版本的iOS中,没有公开(允许App Store允许)方式禁用UIWebView(AFAIK是PhoneGap使用的)表单元素的Web视图上的表单助手栏。

答案 3 :(得分:2)

这看起来像我们一直在等待的cordova插件...... https://github.com/don/KeyboardToolbarRemover

这允许简单的toolbar.hide()toolbar.show()

答案 4 :(得分:2)

如果您使用的是phonegap / cordova 3 CLI,则现在需要一个插件来删除工具栏。 通过终端安装..

$ cordova plugin add org.apache.cordova.keyboard 

并在您的javascript

中使用此功能
Keyboard.hideFormAccessoryBar(true);

但是...... 它并不完美。首先,如果您打算使用input.focus()来调出键盘,则在隐藏之前会简要显示工具栏。从那时起它很好。如果您允许用户直接在输入字段中单击,则可以。

然后可以在屏幕顶部移动,这可以通过这个答案解决.. How to fix keyboard issues with Cordova 3.1 on iOS?

可能很难做到正确,所以我会问自己是否真的需要隐藏它,或者你能否让它对用户有用?

答案 5 :(得分:1)

这对我有用:https://github.com/don/KeyboardToolbarRemover

您必须知道,自Phonegap 2.3.0起没有Cordova.plist文件 - 而是使用以下内容编辑您的配置XML文件:

<plugin name="KeyboardToolbarRemover" value="KeyboardToolbarRemover" />

在分支