Phonegap iOS6: Правильное решение для удаления панели помощника формы (prev, next, done)
Еще одна "как удалить кнопку pre, next, done" - вы можете подумать. На самом деле это не так. Я провел довольно тщательные исследования по этому вопросу и опробовал разные подходы, но ни один метод или решение действительно не делает это правильно. Все обходные пути (то, что они есть), упомянутые и показанные ниже, в основном похожи на один и тот же подход, заменить содержимое файла MainViewController.m. Я хорошо знаю, что более или менее все эти предлагаемые решения несколько hacky, но все же должно быть кто-то там, кто решил эту проблему с немного изяществом и глубокой мыслью или кто-то, кто хорошо знает C и может предложить более прочное решение.
Позвольте мне проиллюстрировать мою точку зрения, сделав ссылки на некоторые предлагаемые решения:
В iOS6 это приводит к тому, что граница формы помощника еще присутствует, а клавиатура действует так, как будто панель помощника формы все еще существует.
Кто-то предложил решение выше, но я просто не могу заставить его работать. Ответчик сделал несколько исправлений и комментариев к сообщению, которые только затрудняют понимание того, что делать. Я пробовал все варианты его решения, но я всегда получаю критическую ошибку , а проект просто не компилируется.
Не программист на C (почему я использую телефонную развязку), поэтому не могу заставить это работать правильно. Не знаю , что добавить где.
Не знаю, где и как это реализовать, поэтому не пробовал. Где я должен зарегистрироваться для получения уведомления keyboardDidShow? Где я должен добавить функцию?
Заключение
Согласно моим исследованиям, если хотите, никто еще не предложил правильное решение этого. Так кто-нибудь успешно удалил помощника формы без каких-либо из вышеупомянутых побочных эффектов?
Ответы
Ответ 1
Здесь вы идете, я использую это в приложении, которое я сейчас разрабатываю. Пальцы перешли, что попадают в магазин приложений, хотя и идут на другие "хаки", которые попадают в магазин, это не хуже других, поэтому стоит стоять справедливо.
Никаких раздражающих побочных эффектов с помощью этого метода - он чисто удаляет планку, убедившись, что она никогда не создавалась в первую очередь. Ta da!
Кредит идет 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
Ответ 2
Для тех, кто все еще борется с этим, у Phonegap теперь есть два свойства для отключения проблемы с аксессуарами формы и проблема прокрутки страницы, когда поля ввода и текстовой области запускают клавиатуру.
Просто установите в вашем файле config.xml следующее:
<preference name="HideKeyboardFormAccessoryBar" value="true" />
<preference name="KeyboardShrinksView" value="true" />
Ссылка на Документацию по телефону
Ответ 3
Нет общедоступного (так, с помощью App Store) способа отключить панель помощника формы для веб-представлений для UIWebView (какой AFAIK использует то, что использует PhoneGap), элементы формы в любой версии iOS.
Ответ 4
Это похоже на плагин cordova, которого мы все ждали...
https://github.com/don/KeyboardToolbarRemover
Это позволяет использовать простые toolbar.hide()
и toolbar.show()
Ответ 5
Если вы используете CLG phonegap/cordova 3, вам теперь требуется плагин для удаления панели инструментов.
Установите его через терминал.
$ cordova plugin add org.apache.cordova.keyboard
и используйте это в своем javascript
Keyboard.hideFormAccessoryBar(true);
Но... это не идеально. Во-первых, если вы собираетесь использовать input.focus(), чтобы открыть клавиатуру, панель инструментов показывается ненадолго, прежде чем скрываться. С этого момента все прекрасно. Если вы позволите пользователю щелкнуть непосредственно в поле ввода, это будет нормально.
Тогда в верхней части экрана может быть движение, которое можно решить с помощью этого ответа.
Как исправить проблемы с клавиатурой с помощью Cordova 3.1 на iOS?
Трудно получить право, поэтому я бы спросил, действительно ли вам нужно скрыть это, или вы можете сделать его полезным для пользователя?
Ответ 6
Это сработало для меня: https://github.com/don/KeyboardToolbarRemover
Вам нужно будет знать, что нет файла Cordova.plist по Phonegap 2.3.0 - вместо этого отредактируйте свой файл конфигурации config со следующим:
<plugin name="KeyboardToolbarRemover" value="KeyboardToolbarRemover" />
в ветке