2014-12-25 564 views
11

它所做的在標籤查看控制器之間傳遞數據在swift?

  1. 當我的標籤欄控制器負載的第一頁,我檢索陣列中的一個JSON文件
  2. 我保存它的數據(在第一個視圖控制器)
  3. 獲得的數據將顯示在第二個視圖控制器中。數據已經加載並存儲在第一個視圖控制器的數組中。

問題:

我不能找出一個的方式來傳遞這兩個視圖控制器之間的數據。由於它是一個標籤欄控制器,因此無法傳遞基於segue標識符的數據。

請幫忙!

+0

[例使用unwind segue](https://stackoverflow.com/a/47751962/3681880)。如果您從一個選項卡的後代導航到另一個選項卡的根目錄,這僅僅是有用的。 – Suragch

回答

16

您可以將數據存儲在AppDelegate上。從多個視圖控制器訪問會很容易。 但是,如果你需要通過視圖控制器之間的數據則:

var secondTab = self.tabBarController?.viewControllers[1] as SecondViewController 
secondTab.array = firstArray 
+0

它說[AnyObject]沒有一個名爲下標 – 0to1000

+0

的成員它在哪裏說的?你能發佈你的代碼嗎? –

0

我在我的應用程序標籤視圖控制器和我在多個選項卡視圖相同的陣列。我通過將數組聲明爲任何類之外的數組(在導入UIKit和類聲明之間的行中)來實現此目的,以便它基本上是每個視圖都可以訪問的全局變量。你試過這個嗎?

+0

你是如何從其他課程訪問的? – 0to1000

+0

我只是把它叫做我已經聲明的任何其他變量。 –

+0

爲什麼這個答案沒有大拇指?這是不好的做法,因爲它似乎是最好/最簡單的解決方案嗎? – bakalolo

10

H. Serdar的代碼示例是正確的,這是訪問另一個選項卡的視圖控制器併爲其提供數據的方式。

請記住,當您在Swift中傳遞數組時,you're passing it by value與Objective-C不同,後者通過引用傳遞它。這意味着由第二個視圖控制器所做的更改不會反映在您的第一個視圖控制器中,因爲您的第二個視圖控制器正在使用數組的副本,而不是同一個數組。如果您希望這兩個視圖控制器都修改相同的數組,請將該數組放在一個類中,然後傳遞該類的單個實例。

其他一些注意事項: 你可以繼承的TabBarController給它那將存儲數據的屬性,這將使用可用於所有選項卡:

if let tbc = tabBarController as? YourCustomTabBarSubclass { 
    println("here's my data \(tbc.array)") 
} 

在這種情況下,你會從多個選項卡訪問相同的數組,所以一個選項卡中的更改將反映在其他地方。

我建議不要將您的App Delegate用作集中存儲數據的方法。這不是應用程序委託的目的。其目的是處理應用程序對象的委託調用。

視圖控制器應該擁有所有需要完成工作的數據。它們與模型數據(例如數組或數據庫引用或託管對象上下文)有連接關係,而不是通過遍歷視圖控制器圖或者進入委託或者甚至將視圖控制器伸出到另一個對象使用全局變量。 View Controller的這種模塊化自包含結構允許您在不同設備上重構類似但獨特設計的應用,例如在一個設備(如iPad)的彈出窗口中呈現視圖控制器,並將其全屏顯示在另一設備上,例如一個iPhone。

3

SWIFT 3

在第一個的ViewController,聲明你的變量(在你的情況下數組)像通常那樣。

在你的第二個視圖控制器,這樣做:

var yourVariable: YourVariableClass { 
    get { 
     return (self.tabBarController!.viewControllers![0] as! FirstViewControllerClass).yourVariable 
    } 
    set { 
     (self.tabBarController!.viewControllers![0] as! FirstViewControllerClass).yourVariable = newValue 
    } 
} 

這樣做是因爲,在tabbarcontroller標籤項後面的所有viewcontrollers被初始化。通過在第二個視圖控制器中執行此操作,您實際上是從第一個視圖控制器中/從/設置變量。

+0

這應該是正確的答案! –

6

我最終在上面的回答中使用了Woodster的建議。

在斯威夫特3

創建一個新的快捷文件,並創建一個類:

class Items { 
    static let sharedInstance = Items() 
    var array = [String]() 
} 

在任何您的視圖控制器,你可以訪問陣列,像這樣:

Items.sharedInstance.array.append("New String") 
print(Items.sharedInstance.array) 
+2

發現這個問題後,討論了1/2次 - 在堆棧和其他地方討論,以及爲解決問題的方法提供了許多不同的答案 - **這是問題/要求的最清晰和簡潔的答案/解決方案** 。這是一個很好的清潔架構,與模型視圖展示器等設計模式一致。如果我能夠在人們詢問如何做到這一點時幫助專注交通,我想要5次投票答覆。非常感謝分享對我來說像最佳做法..又名,正確的方法 - 解決這個要求 – gnB

+0

我很高興我可以幫助:)更多信息在這裏。 https://krakendev.io/blog/the-right-way-to-write-a-singleton – Jeff

+0

更新:使用單身人士有很多爭議。被告知。 – Jeff

相關問題