2016-11-22 62 views
2

我想使用Swift 2.3導航到UIViewController。更確切地說,我正在嘗試重新加載目前處於活動狀態的UIViewController。我不知道用戶當前有哪些視圖處於活動狀態,因此必須動態定義。導航到Swift 2.3中的UIViewController

我嘗試了幾種方法,但它們都導致編譯或運行時錯誤。

是這樣的可能嗎?

let activeViewIdentifier = ??? // Get currently active view identifier as a string 
self.performSegueWithIdentifier(activeViewIdentifier, sender:self) 
+0

爲刷新目的,你可以打電話viewwillapear和viewDidLoad中方法 –

+0

你不應該自己調用這些方法,因爲它可以調用超類方法,這將是意想不到的電話。然而,你可以創建你自己的方法,這些方法可以從viewDidLoad等被調用,當你需要刷新視圖時也可以直接調用。 – Paulw11

回答

0

你可以得到這樣的:

的Objective-C:

self.navigationController.topViewController.restorationIdentifier 

斯威夫特:

self.navigationController?.topViewController?.restorationIdentifier 
+0

當從我的'BaseUIViewController'類中的函數(從UIViewController繼承),'self .navigationController?.topViewController?.restorationIde ntifier'是零 - 是否預期? –

+0

是的,由於某些原因。可能你的視圖控制器不是由navigationConroller封裝的。您可以打開故事板並找到您的初始視圖控制器(左側的箭頭),然後從菜單「編輯器>嵌入>導航控制器」中進行選擇,以實現此目的。 – mgyky

+0

我有一個自定義的'UINavigationController',它有一個鏈接到故事板中最初的'ViewController'。 –

0

我認爲你必須與你的架構的一些問題;它不是重載所有可以選擇的View Controller上的所有內容的最佳方法;思維

更好的辦法是確定的,正是你想要重新加載,並添加方法來重新加載只有這樣的東西

無論如何,如果我的回答並沒有向你保證,考慮用新的替換現有的視圖控制器和什麼用一些動畫呈現它,或者沒有它;所以你一般的算法可能是這樣的:

  1. 獲得從情節串連圖板,或創建新實例新的VC,如果你不喜歡使用它
  2. 推它在你現有的控制器
  3. 刷新棧導航控制器,在其中你現在是
+0

感謝您的回覆。我想我真的想重新加載整個'ViewController',但如果我錯了,請糾正我。我正在確定互聯網連接已經丟失,並且可能已經返回。我正在檢查'viewWillAppear()'中的連通性,所以重新加載整個視圖看起來就像是要做的事情... –

+0

爲什麼整個視圖? :)可能是你想重新加載所有的標籤,我不知道,所有的tableViews?您可以添加方法'重新加載'並將其調用爲存在的VC –

0

你可以試試這個

let activeViewIdentifier = self.navigationController?.childViewControllers[(self.navigationController?.childViewControllers.count)!-1] 

您可以使用restoreIdentifier,它位於Storyboard標識的正上方,它是一個UIViewController屬性。

let activityIdentifierStr = activeViewIdentifier?.restorationIdentifier 

self.performSegueWithIdentifier(activityIdentifierStr!, sender:self) 
+0

運行時錯誤:不安全的指針。 'viewWillAppear()'期間訪問'activeViewIdentifier?.restorationIdentifier'爲零 –