删除 WKWebView 使键盘卡在打开状态

问题描述 投票:0回答:1

更新了使用

UIWebView
的应用程序,改为使用
WKWebView
。但是,可以按照以下步骤使键盘保持打开状态并保持无响应:

  • A
    WKWebView
    打开一个具有输入字段并附加到超级视图的 URL。
  • 输入字段被激活并显示键盘。
  • 可以按预期使用键盘输入文本。
  • 在显示键盘时执行从超级视图中删除 WKWebView 的操作。键盘按预期与 WKWebView 一起被删除。
  • 打开一个新的 WKWebView 到具有输入字段并附加到超级视图的 URL。
  • 激活输入字段并显示键盘。
  • 在显示键盘时执行从超级视图中删除 WKWebView 的操作。

此时键盘不会消失,也无法使其消失。

显然,期望的行为是每次 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; }


ios objective-c wkwebview
1个回答
0
投票

但是,如果您在键盘关闭后删除网络视图,则可以解决此问题。

将这些添加到

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 毫秒)。

© www.soinside.com 2019 - 2024. All rights reserved.