2017-08-10 21 views
0

我的應用使用Tab Bar Controller,其中包含多個View Controller在不同的選項卡中。當用戶打開應用程序時,他們將首先進入FirstView。我想在SecondView中添加一些方法來刷新FirstView。這是我的FirstViewController.swift在標籤欄控制器中刷新SecondView來自SecondView

class FirstViewController: UIViewController, UIScrollViewDelegate { 

    override func viewDidLoad() { 

     super.viewDidLoad() 

我試圖把

FirstViewController().viewDidLoad() 

在我SecondViewController.swift,但是這是行不通的。有沒有更好的方法來刷新FirstView?

+2

使用代表您的概念 –

+2

或者您可以通過使用'self.tabBarController.viewControllers [index]' – Akhilrajtr

+2

訪問viewcontroller爲什麼你自己調用'viewDidLoad'方法?您不應該調用它,因爲它自動被操作系統調用,並且只有在視圖加載時纔會調用它。 –

回答

1

你可以試試這個: - 的 而不是0通過你的FirstViewController

if let firstVC = self.tabBarController?.viewControllers?[0] as? FirstViewController { 
     firstVC.viewDidLoad() 
} 
+0

謝謝。這項工作! – user2872856

0

你不應該自己調用viewDidLoad。它只在視圖加載時調用一次。

如果您希望在顯示控制器視圖之前更新控制器視圖,可以使用viewWillAppear來更改佈局或任何您想要執行的操作。

+0

對不起,也許我以前的標題聽起來很混亂。我改變了我的頭銜。我想實現的是從SecondView刷新FirstView。我怎樣才能做到這一點? – user2872856

+0

我不認爲你會這麼做。如果視圖不可見,則無法刷新。你可以做的最好的地方是viewWillAppear。您可以使用維護數據狀態並基於viewWillAppear中的狀態,您可以在其顯示之前刷新視圖。 –

0

問題是你如何告訴其他視圖控制器它需要更新其視圖。爲此,您有兩個潛在的解決方案,因爲有效地,您正在確定不同對象之間進行通信的最佳方式。

通知鬆散地分離,傾向於對一對多關係有用。一個對象可以觸發通知,並且一個或多個對象可以偵聽該通知。在這種情況下,當一個視圖控制器中的某個狀態發生更改時,可以廣播通知,另一個視圖控制器可以觀察該通知,以便在應該更改時通知它。

代表更緊密耦合,因爲它們是一對一的。它們通常是通過在符合某種協議的對象上創建委託屬性來實現的。另一個對象然後將該委託屬性分配給自己並實現該協議,以便在代理上調用該函數時調用其實現。在你的情況下,每個視圖控制器可以有一些協議的委託屬性。標籤欄控制器可以將委託屬性分配給自己並處理這些功能的實現。因此,無論何時發生更改並調用委託,標籤欄控制器都可以負責告知哪些視圖控制器更新其視圖。

當然還有其他處理您的情況的方法,例如更新viewWillAppear中的視圖。這樣,無論何時視圖控制器出現在屏幕上,都可以執行一些代碼來更新其視圖。

它最終取決於您如何存儲應用程序狀態和應用程序的設計。

2

的指數做出firstViewController的靜態引用試試這個方法,然後通過這個引用,你可以調用任何功能

class ViewController: UIViewController { 
     static var firstVC : ViewController? 
     override func viewDidLoad() { 
      super.viewDidLoad() 
      print("m on FirstViewController ") 
      ViewController.firstVC = self 
     } 
} 

class SecondViewController: UIViewController { 

     override func viewDidLoad() { 
      super.viewDidLoad() 
      print("m on SecondViewController ") 
      ViewController.firstVC?.viewDidLoad() 
     } 

} 
+0

我得到錯誤使用未聲明的標識符視圖控制器 – user2872856

+0

你可能已經做了一些命名約定錯誤..如果你可以顯示你的代碼 –

+0

我已經得到了解決方案。 Upvote你的嘗試。 – user2872856