更新了使用
UIWebView
的应用程序,改为使用 WKWebView
。但是,可以按照以下步骤使键盘保持打开状态并保持无响应:
WKWebView
打开一个具有输入字段并附加到超级视图的 URL。此时键盘不会消失,也无法使其消失。
显然,期望的行为是每次 webview 消失时键盘都会消失。
我编写了一个简单的小测试应用程序,我可以在应用程序的复杂性之外重现该问题。
那么处理 WKWebView 的可接受方法是什么?这是一个代码片段,说明了“不”对我有用,第二次调用时键盘毫无生气,就好像它已被分离和遗忘一样。
[webView stopLoading];
webView.navigationDelegate = nil;
webView.scrollView.delegate = nil;
[webView removeFromSuperview];
webView = nil;
这是一个更多的工作示例。我试图保持简单并使用双击来添加/删除,但是按钮或计时器也可以触发网络视图的添加/删除。我认为这没有什么区别。该问题似乎是在键盘打开且处于活动状态时处理 WKWebView。
- (void)viewDidLoad {
[super viewDidLoad];
webView = nil;
webViewIsActive = FALSE;
tap2Recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
tap2Recognizer.numberOfTouchesRequired = 1;
tap2Recognizer.numberOfTapsRequired = 2;
tap2Recognizer.delegate = self;
[self.view addGestureRecognizer:tap2Recognizer];
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
return YES;
}
- (void)handleDoubleTap:(UITapGestureRecognizer *)gestureRecognizer
{
if (webViewIsActive) {
if (keyboardIsVisible) [webView endEditing:true];
else [self removeWebView];
} else [self addWebView];
}
- (void)addWebView {
webView = [[WKWebView alloc] initWithFrame:self.view.frame];
webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
webView.allowsBackForwardNavigationGestures = false;
webView.navigationDelegate = self;
// Do any additional setup after loading the view.
NSURL *url = [NSURL URLWithString:@"https://google.com"];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[webView loadRequest:requestObj];
[self.view addSubview:webView];
webViewIsActive = TRUE;
}
- (void)removeWebView {
if (webView)
{
[webView stopLoading];
webView.navigationDelegate = nil;
webView.scrollView.delegate = nil;
[webView removeFromSuperview];
webView = nil;
}
webViewIsActive = FALSE;
}
但是,如果您在键盘关闭后删除网络视图,则可以解决此问题。
将这些添加到
viewDidLoad
:
[NSNotificationCenter.defaultCenter addObserverForName:UIKeyboardWillShowNotification
object:nil
queue:nil
usingBlock:^(NSNotification * _Nonnull notification) {
self.keyboardIsVisible = YES;
}];
[NSNotificationCenter.defaultCenter addObserverForName:UIKeyboardDidHideNotification
object:nil
queue:nil
usingBlock:^(NSNotification * _Nonnull notification) {
self.keyboardIsVisible = NO;
[self removeWebView];
}];
,并更新
removeWebView
仅当
keyboardIsVisible
标志关闭时才执行其操作:- (void)removeWebView {
if (!self.keyboardIsVisible) {
[webView stopLoading];
webView.navigationDelegate = nil;
webView.scrollView.delegate = nil;
[webView removeFromSuperview];
webView = nil;
webViewIsActive = NO;
}
}
此外,还有一件事,您需要
[self.view endEditing:YES]
而不是
[webView endEditing:YES]
才能正常工作:- (void)handleDoubleTap:(UITapGestureRecognizer *)gestureRecognizer {
if (webViewIsActive) {
[self.view endEditing:YES];
[self removeWebView];
} else {
[self addWebView];
}
}
您还需要处理用户在键盘关闭期间再次双击的情况(据我观察,这大约需要 600 毫秒)。