簡體   English   中英

如何使數據對所有視圖控制器可見?

[英]How to make data visible for all view controllers?

讓我們考慮以下情況:

我有一個選項卡欄應用程序,在其中點擊每個選項卡欄項會將用戶帶到其他視圖,該視圖由不同的視圖控制器(典型模式)處理。

在我的一個控制器中,我有一種方法可以下載重要數據,並且希望它們對於整個應用程序是全局的。 我應該使用哪種設計模式?

一種方法是使用持久性(例如核心數據)存儲此數據,但這是使數據對所有視圖控制器可見的唯一方法嗎? 也許應用程序委托能夠執行此類操作?

通常,如何解決這種情況,即您擁有一些數據或變量,這些數據或變量對於項目中的所有視圖控制器都是可見的?

請注意,我並不是要在應用程序的各個啟動之間持久保存數據,我只是想知道如何在整個項目中使某些數據具有全局性。

不要(強調不要)使用以下內容:

  • 單身
  • AppDelegate(只是另一個Singleton)
  • NSUserDefaults的

寧可不要:

  • 核心數據

做:

  • 在實例化期間或通過屬性傳遞

為什么?

不要弄亂你的記憶
寧可不要弄亂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的實現中管理單例的實際創建,該方法最終將返回該單例。

單例模式在這里可能很有用。 在Swift中,可以這樣創建:

class SomeManager {
    static let sharedInstance = SomeManager()

    var someData: NSData?
}

稍后在您的視圖控制器中作為SomeManager.sharedInstance.someData訪問它

有關Swift中單例的更多信息以及Objective-C的更多信息,請點擊此處

試試這個簡單的方法,

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM