簡體   English   中英

WKWebView 操作表在被解散后解散呈現視圖控制器

[英]WKWebView action sheet dismisses the presenting view controller after being dismissed

我有一個嵌入在 NavigationController 中的視圖控制器 (WKWebViewController)。 這個 ViewController 呈現了一個 WKWebView。 導航到任何網頁后; 並且在長按任何檢測到的內容(例如電話號碼或鏈接)時,會顯示帶有復制、共享等選項的操作表。顯示根視圖控制器! 無論選擇是什么,是復制、取消,還是點擊屏幕上的任何地方。

我試過覆蓋“ present(_ viewControllerToPresent: UIViewController, animation flag: Bool, completion: (() -> Void)? = nil) ”和“ dismiss(animated flag: Bool, completion: (() -> Void)?) " 試圖了解正在發生的事情,但隨后意識到操作表既沒有被其父視圖控制器 (WKWebViewController) 關閉,事實上我在根視圖控制器上做了同樣的事情,發現它也沒有出現在它上面。

我做了很多搜索試圖了解導致這種行為的原因,我什至只用一個簡單的 WKWebView 構建了一個新項目,但總是以同樣的問題告終。

這是代碼:

import UIKit; import WebKit
class WKWebViewController: UIViewController, WKUIDelegate, WKNavigationDelegate {

var destinationUrlString: String?
var myWebView: WKWebView!

override func viewDidLoad() {
    super.viewDidLoad()

    let webConfiguration = WKWebViewConfiguration()
    webConfiguration.dataDetectorTypes = []
    let origin = CGPoint(x: 0, y: 0)
    let size  = CGSize(width: view.frame.size.width, height: view.frame.size.height)
    myWebView = WKWebView(frame: .init(origin: origin, size: size), configuration: webConfiguration)
    myWebView.uiDelegate = self
    myWebView.navigationDelegate = self
    myWebView.allowsLinkPreview = false
    view = myWebView

    destinationUrlString = "https://www.stackoverflow.com"
    guard let url = URL(string: destinationUrlString!) else {return}
    print(url)
    let request = URLRequest(url: url)
    myWebView.load(request)
}
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
    //show progress indicator
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    //dismiss progress indicator
}
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
    //show error
}
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
    //show error
}
}

我還附上了一個顯示問題的 GIF:

在此處輸入圖片說明

我正在使用 Xcode 9.3 (9E145) 和 Swift 4.1。

我錯過了什么嗎? 如何解決這個問題? 任何幫助將不勝感激。

我也遇到過同樣的問題。

為了處理這種情況,在UIViewController層次結構的根視圖控制器中(在您的情況下,這將是“根視圖控制器”——注意,在許多情況下,它可能是一個UINavgiationController ,然后您必須對其進行子類化)覆蓋dismissViewControllerAnimated:completion:處理WKWebView調用dismiss。

目標-C

@property (weak) UIViewController *lastPresentedController;

- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion
{
    // WKWebView actions sheets workaround
    if (self.presentedViewController && self.lastPresentedController != self.presentedViewController ) {
        self.lastPresentedController = self.presentedViewController;
        [self.presentedViewController dismissViewControllerAnimated:YES completion:^{
            if( completion ) {
                completion();
            }
            self.lastPresentedController = nil;
        }];
    } else if( !self.lastPresentedController) {
        [super dismissViewControllerAnimated:flag completion:completion];
    }
}

斯威夫特

private weak var lastPresentedController : UIViewController?

override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
    // WKWebView actions sheets workaround
    if presentedViewController != nil && lastPresentedController != presentedViewController  {
        lastPresentedController = presentedViewController;
        presentedViewController?.dismiss(animated: flag, completion: {
            completion?();
            self.lastPresentedController = nil;
        });

    } else if lastPresentedController == nil {
        super.dismiss(animated: flag, completion: completion);
    }
}

這一定是個bug。 如果您在包含 web 視圖的 viewController 中覆蓋dismiss ,則當用戶從操作表中選擇任何操作時,它將被調用。 如果您在關閉覆蓋中放置一個斷點,您可以看到presentedViewController 的類型為WKActionSheet,它是一個內部類。 他們很可能會調用dismiss來關閉action sheet,然后它會逐漸進入並關閉我們包含web view的視圖控制器。 您可以從該函數中返回以防止關閉,但是他們選擇的操作也不會發生。

如果你不想提交雷達文件,請告訴我,我會的。

- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion{
    if (@available(iOS 11, *)) {
        [super dismissViewControllerAnimated:flag completion:completion];
    }
    else{
        if ([self.topViewController isKindOfClass:[RTContainerController class]]){
            RTContainerController *topVC = (RTContainerController *)self.topViewController;
            if (![topVC.contentViewController isKindOfClass:NSClassFromString(@"MyWebViewController")]) {
                //讓非 web 頁面可以正常消失
                [self.topViewController dismissViewControllerAnimated:flag completion:completion];
            }else{
                //防止 web 頁面消失
                if (self.presentedViewController) {
                    [self.presentedViewController dismissViewControllerAnimated:flag completion:completion];
                }
            }
        }else{
            if (self.presentedViewController) {
                [self.presentedViewController dismissViewControllerAnimated:flag completion:completion];
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM