[英]How to make data visible for all view controllers?
讓我們考慮以下情況:
我有一個選項卡欄應用程序,在其中點擊每個選項卡欄項會將用戶帶到其他視圖,該視圖由不同的視圖控制器(典型模式)處理。
在我的一個控制器中,我有一種方法可以下載重要數據,並且希望它們對於整個應用程序是全局的。 我應該使用哪種設計模式?
一種方法是使用持久性(例如核心數據)存儲此數據,但這是使數據對所有視圖控制器可見的唯一方法嗎? 也許應用程序委托能夠執行此類操作?
通常,如何解決這種情況,即您擁有一些數據或變量,這些數據或變量對於項目中的所有視圖控制器都是可見的?
請注意,我並不是要在應用程序的各個啟動之間持久保存數據,我只是想知道如何在整個項目中使某些數據具有全局性。
不要弄亂你的記憶
寧可不要弄亂SOLID的幾個原理。
創建一個具有獲取數據屬性的基本視圖控制器,使所有視圖控制器都從其繼承。
子類UITabBarController
如果選擇了新的視圖控制器,則將數據設置為視圖控制器
實施有些棘手,這是來自真實世界的應用程序
class ContentTabBarController : UITabBarController {
private var kvoSelectedViewControllerContext: UInt8 = 1
required init(coder aDecoder: NSCoder) {
self.addObserver(self, forKeyPath: "selectedViewController", options: .New | .Old | .Initial , context: &kvoSelectedViewControllerContext)
}
deinit{
self.removeObserver(self, forKeyPath: "selectedViewController")
}
override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
if context == &kvoSelectedViewControllerContext {
var targetVC : UIViewController?
if let viewController = change["new"] as? UIViewController{
if let oldViewController = change["old"] as? UIViewController{
if viewController != oldViewController {
targetVC = viewController
}
}
} else {
targetVC = self.viewControllers![0] as? UIViewController
}
self.configureTargetViewController(targetVC)
}
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.translucent = false
}
func configureTargetViewController(viewController: UIViewController?){
//setup data
}
}
好吧,這取決於您。 它可以獲取核心數據,實際上可以通過獲取管理器作為數據。 它可以從光盤或網絡讀取。 但是對於一個理智的設計,它不應該自己做,而要使用另一個類。 並且應該從選項卡欄控制器外部(即從App Delegate)設置此fetcher類的實例。
一種簡單的方法是構造一個結構並使其包含變量。 然后,您可以隨時編輯它。 例如:
struct Variables {
static var number = 4
}
然后,您可以通過執行以下代碼在所需的任何視圖控制器中的“變量”中編輯數據。
Variables.number = 6 //or any other number you want
做到這一點的一種更干凈高效的方法(雖然不一定是不同的)是創建一個單例類 ,例如AppData
,您可以通過多種方式訪問它,並且該類對於所有其他類都可用。 它具有將特定於應用程序的內容與應用程序委托的內容分開的好處。 您可以這樣定義類:
@interface AppData : NSObject
// Perhaps you'll declare some class methods here & objects...
@end
您可以為AppData類定義ivars,然后管理AppData的單例實例。 使用類方法,例如+ sharedInstance ,獲取單例的句柄,然后可以在其上調用方法。 例如,
[[AppData sharedInstance] someMethod:myArgument];
您可以在+ sharedInstance的實現中管理單例的實際創建,該方法最終將返回該單例。
試試這個簡單的方法,
1)在appdelegate.swift中創建一個對所有viewcontroller都可見的變量。
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
...
...
var Check:String!="" // to pass string
...
...
}
2)在任何viewcontroller中創建appdelegate實例
viewcontroller1.swift
import UIKit
class ViewController: UIViewController {
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
...
...
override func viewDidLoad() {
super.viewDidLoad()
...
var tmp = "\(appDelegate.Check)"
appDelegate.Check="Modified"
}
}
Viewcontroller2.swift
import UIKit
class ViewController: UIViewController {
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
...
...
override func viewDidLoad() {
super.viewDidLoad()
...
var getdata = "\(appDelegate.Check)"
println("Check data : \(getdata)") // Output : Check data : Modified
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.