2016-12-27 145 views
1

我用客觀的C和組合迅速3.視圖控制器加載兩次

在我MAINVIEW(目標C)我有以下

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:[NSBundle mainBundle]]; 
    CourseViewController *courseView = (CourseViewController*)[storyboard instantiateViewControllerWithIdentifier:@"courseView"]; 
    [self.navigationController pushViewController:courseView animated:YES]; 

在我的故事板,我的MAINVIEW將呈現導航控制器,它是rootView到swift 3視圖。

在迅速3視圖控制器我有以下和的loadView和viewDidLoad中被調用兩次

override func loadView() { 
    webView = WKWebView() 

    //If you want to implement the delegate 
    webView?.navigationDelegate = self 

    view = webView 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    let temp: CGRect = UIScreen.main.bounds 
    screenSize = temp 
    let url = URL(string: kcourseURL) 
    let req = URLRequest(url: url!) 
    webView.allowsBackForwardNavigationGestures = true 
    webView.load(req) 
    //webView.frame = CGRect(x:0, y:navBarHeight, width:Int(screenSize.width), height:Int(screenSize.height)) 

    webView.addObserver(self, forKeyPath: #keyPath(WKWebView.estimatedProgress), options: .new, context: nil) 

    self.setBarButton() 


} 

爲什麼它被稱爲兩次任何建議?

此外,我試圖解僱這個觀點回到主視圖,但它不會被調用,如果我在SWIFT 3視圖上使用導航控制器。我試過以下。我是否需要使用segue展開才能返回到mainView?

 self.dismiss(animated: true, completion: nil) 

    _ = self.navigationController?.popToRootViewController(animated: true) 
+1

爲什麼你反正用故事板時明確實例化視圖控制器? – vadian

+0

你在兩個viewControllers之間的'Storyboard'中設置了一個segue嗎? – dirtydanee

+0

我在2視圖之間的故事板中設置了segue。課程視圖具有一個導航控制器作爲根視圖。我明確地實例化視圖,因爲我在目標c中這樣做,不知道當我爲Swift實現一個目標c時如何改變。如果我沒有實例化它,視圖不會僅僅通過故事板設置來調用。 –

回答

2

如果您在應用程序導航控制器那麼這裏有一件事我要在這裏明確使用,如果你正在使用Segue公司導航則沒有必要用代碼的幫助下在這裏再次撥打了同樣的觀點只能選擇一個在這裏處理。導航將取決於你想要哪種類型,如推送,顯示,模態呈現,並呈現爲彈出式。

後只需要使用一個線回查看或回根視圖: -

self.dismiss(animated: true, completion: nil) 

OR

_ = self.navigationController?.popViewController(animated: true) 

OR
爲回Rootview

_ = self.navigationController?.popToRootViewController(animated: true) 

對於導航,一個故事板到另一個: -

Objective-C的

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
SecondViewController *second = (SecondViewController *)[storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; 
[self.navigationController pushViewController:second animated:YES]; 

斯威夫特3

let storyboard = UIStoryboard(name: "Customer", bundle: nil) 
let secondVC = storyboard.instantiateViewController(withIdentifier: "SecondVC") as! SecondVC 
self.navigationController!.pushViewController(secondVC, animated: true) 

並與Segue公司

首先東東嘗試d取storyBoard參考,然後添加storyBoardname,然後在參考ID內添加ViewController的StoryBoard ID。

add Storyboard reference

並且還確認目標控制器的故事板ID

View Controller's StoryBoard ID

和最後PerformSegue與數據賽格瑞標識符: -

let segueIdentifier = "fourthView" 

//MARK: - Navigation 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == segueIdentifier { 
      let controller = segue.destination as! FourthVC 
      //Passing Values here 
      controller.promoViewModel = promotionModel[0] 
     } 
    } 

輸出會像下面圖像不需要做任何額外的事情: -

OutPut View

+0

我正在使用一個segue,並在執行segue,我稱之爲以下UIStoryboard * storyboard = [UIStoryboard storyboardWithName:@「Storyboard」bundle:[NSBundle mainBundle]]; CourseViewController * courseView =(CourseViewController *)[storyboard instantiateViewControllerWithIdentifier:@「courseView」]; [self.navigationController pushViewController:courseView animated:YES]; –

+0

我已經嘗試了所有這3種方法,並且不會解散並返回到根視圖。這些工作,如果我不使用導航視圖作爲根視圖,但然後我失去了我的所有按鈕的導航欄 –

+0

你在同一個故事板或另一個故事板執行segue?如果你從一個故事板執行segue到另一個故事,我正在更新我的答案。 –

0

再檢查一下,如果,你叫loadView()方法,因爲你的代碼是不是所有的崗位,如果是:

你不應該直接調用loadView(),accoring蘋果doc

你應該從不直接調用此方法。視圖控制器在請求其視圖屬性時調用此方法,但當前爲零。此方法加載或創建視圖並將其分配給視圖屬性。

如果視圖控制器有關聯的nib文件,則此方法從nib文件加載視圖。如果nibName屬性返回一個非零值(如果視圖控制器是從故事板實例化的,如果使用init(nibName:bundle :)方法顯式指定它爲nib文件),則視圖控制器具有關聯的nib文件,或者如果iOS在應用程序包中找到一個基於視圖控制器類名的名稱的nib文件。如果視圖控制器沒有關聯的nib文件,則此方法會創建一個普通的UIView對象。

如果子類沒有使用筆尖,那麼子類應該創建自定義視圖層次。不應該直接調用。

無論你加載Xib的視圖還是自己創建視圖,在加載視圖後總會調用viewDidLoad

採取下面的代碼:

webView = WKWebView() 

//If you want to implement the delegate 
webView?.navigationDelegate = self 

view = webView 

loadView()viewDidLoad(),並刪除loadView()方法。


編輯 - 1

我有寫一個demo測試您的混合項目,我覺得它不是因爲loadView(),我嘗試使用perform segue和使用navigationController push,沒有工作,所以我的答案不適合你,我發現爲什麼混合演示中存在這個問題,很奇怪。

+2

我看不到'loadView()'在問題中被調用。 – vadian

+0

我沒有調用loadView,它會自動調用。但在我的實現中,loadView和viewdidload被觸發兩次,所以我的視圖加載兩次。 –

相關問題