2017-03-25 47 views
0

我有一個UIViewControllerUIWebViewDelegate。我發現我可以呈現它很好,但不推動它。如果我嘗試推送它,目標視圖控制器將加載並執行任何變量集但不會觸發viewDidLoad(),而只是返回到我的調用菜單視圖控制器,而不會出錯。Swift 3.可以用UIWebViewDelegate呈現一個UIViewController,但不會推送它

我在類之後的第一個var聲明中設置了一個斷點並遍歷了代碼。當它到達webView init時,它會在模擬器中閃現home(不是目標)視圖控制器,然後在返回到我的主視圖控制器之前通過var聲明繼續。

這裏是我的菜單代碼

作品:

let myWebViewController = MyWebViewController() 

myWebViewController.urlString = "myUrl" 

present(myWebViewController, animated: true, completion: nil) 

不起作用

let myWebViewController = MyWebViewController() 

myWebViewController.urlString = "myUrl" 

let navController = (UIApplication.shared.delegate as! AppDelegate).navController 

navController!.pushViewController(myWebViewController, animated: true) 

這是我編校目標視圖控制器代碼。要加載的URL在菜單中設置。

import UIKit 

class MyWebViewController: UIViewController, UIWebViewDelegate { 

var urlString: String = "invalid url" 

var url: URL { 
    return URL(string: urlString)! 
} 

var urlRequest: URLRequest { 

    var urlRequest = URLRequest(url: url) 

    return urlRequest 
} 

let webView: UIWebView = { 
    let view = UIWebView() 
    view.backgroundColor = .white 
    view.translatesAutoresizingMaskIntoConstraints = false 
    return view 
}() 

// declare various buttons and stack views 

override func viewDidLoad() { 
    super.viewDidLoad() 

    webView.delegate = self 

    contentStackView.addArrangedSubview(webView) 

    mainStackView.addArrangedSubview(contentStackView) 

    view.addSubview(mainStackView) 
} 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(true) 

    webView.loadRequest(urlRequest as URLRequest) 
} 
+0

你能展示更多的代碼嗎?短語「present(myWebViewController ...」)或者是「navController!」。如果你沒有顯示變量'myWebViewController'的位置,那麼'pushViewController'就沒有意義了,而且我懷疑你沒有顯示的代碼中的某處是_exactly_問題的根源。 - 另外,請返回所有代碼並使所有_classes以大寫字母_開頭。所以這將是一個變量'myWebViewController',其類型爲'MyWebViewController'。 – matt

+0

小寫的類名只是在這裏的拼寫錯誤。我更新了我的問題以添加更多代碼。 – markhorrocks

+0

由於目標視圖開始加載,我不認爲菜單代碼是問題,但可能是錯誤的。 – markhorrocks

回答

1

該問題與網絡視圖,網絡視圖控制器或其他任何事情無關,除了您推送視圖控制器的位置。你在說:

let navController = (UIApplication.shared.delegate as! AppDelegate).navController 
navController!.pushViewController(myWebViewController, animated: true) 

這是非常不尋常的。通常的事情是,我們是一個導航界面裏已經和我們推到其堆棧:

let navController = self.navigationController 
navController!.pushViewController(myWebViewController, animated: true) 

但你不說。爲什麼不?我猜這是因爲self不是 a navigationController。所以你正在成功地推上導航控制器,好吧,但你不是看到什麼都發生,因爲導航控制器是幕後 - self視圖控制器的視圖阻止它或已經取代它。

這就解釋了爲什麼你永遠不會檢測到網址加載。您撥打webView.loadRequest的電話號碼是viewWillAppear。但是這種看法會出現而不是;它在幕後。 viewWillAppear永遠不會被調用。同樣viewDidLoad不叫,因爲這個觀點是不是去加載;導航控制器不佔用接口 - self是。

+0

我知道調用視圖控制器沒有導航控制器,但我怎麼把它帶到根控制器的前面?感謝您提供有關'viewWillAppear()'的更多信息''viewDidLoad()'中的一個斷點表明它永遠不會被觸發。 – markhorrocks

+0

取消對應用程序委託導航控制器的調用導致由於nil而導致崩潰。側面菜單沒有導航控制器,除非我隱藏它,這看起來像是一種黑客攻擊,我不知道它有什麼可能。 – markhorrocks

+0

「正如我所說的,」將應用程序委託導航控制器的調用導致崩潰,因爲無「正確,因爲'self'沒有導航控制器。 – matt

1

我可能會想到一種情況,爲什麼webViewController沒有被推送。

您嘗試進行推送的UIViewController可能不是導航控制器層次結構的一部分。

你爲什麼不從AppDelegate中

self.navigationController?.pushViewController(myWebViewController, animated: true) 

嘗試使用代碼,而不是獲取navController如果這個不奏效那麼你肯定做錯了什麼。

+0

這個崩潰了。我知道UITableView菜單沒有導航控制器。問題是如何讓視圖加載一個? – markhorrocks

+0

使你的tableviewcontroller成爲UINavigationController的rootviewcontroller,它應該可以工作。 –

相關問題