![](/img/trans.png)
[英]Presenting a View Controller after a UIPopoverController is dismissed
[英]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.