2015-04-19 93 views
2

我是新來的swift和iOS。我正在爲一個高中項目開發應用程序。我有兩個文件,每個文件都有一個在其中定義的類。具有相同名稱的類的ViewController和具有一個類BLEManager和另一個BLEHandler的BLEHandler。NSUserDefaults創建全局訪問變量

BLEHandler用於掃描廣告BLE設備並收集這些設備的UUID並將其打印出來。現在,我用「變量」代替UUID

我希望能夠在按下按鈕(在ViewController中設置)時將「變量」的值打印到控制檯。這意味着我需要在ViewController中獲得BLEHandler的「變量」值。

我在這裏給出了我在userdefaults中設置「變量」的當前代碼。

let defaults = NSUserDefaults.standardUserDefaults() 
defaults.setObject("test", forKey: "variable") 

而我的代碼從ViewController訪問「變量」在這裏給出:

@IBAction func buttonPress(sender: AnyObject) { 
     let defaults = NSUserDefaults.standardUserDefaults() 
     let name = defaults.stringForKey("variable") 
     println(name) 
} 

好像它應該工作,但我從println(name)線得到的是nil ... 任何建議?

在此先感謝!

編輯:這裏是完整的代碼,因爲它目前爲:

視圖控制器類:

import UIKit 
import Foundation 
import CoreBluetooth 
class ViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 
    @IBAction func buttonPress(sender: AnyObject) { 
      let defaults = NSUserDefaults.standardUserDefaults() 
      let name = defaults.stringForKey("variable") 
      println(name) 
     } 
    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 

BLEHANDLER類:

import Foundation 
import CoreBluetooth 
class BLEManager{ 
    var centralManager: CBCentralManager! 
    var bleHandler: BLEHandler 
    init(){ 
     self.bleHandler=BLEHandler() 
     self.centralManager=CBCentralManager(delegate:self.bleHandler, queue:nil) 
    } 
} 
class BLEHandler: NSObject, CBCentralManagerDelegate{ 
    override init(){ 
     super.init() 
    } 
    func centralManagerDidUpdateState(central: CBCentralManager!){ 
     switch(central.state){ 
     case .Unsupported: 
      println("not supported") 
     case .Unauthorized: 
      println("not authorized") 
     case .Unknown: 
      println("ble unknown") 
     case .Resetting: 
      println("resetting") 
     case .PoweredOff: 
      println("powered off") 
     case .PoweredOn: 
      println("powered on") 
      central.scanForPeripheralsWithServices(nil, options: nil) 
     default: 
      println("ble default") 
     } 
    } 
    func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject:AnyObject]!,RSSI:NSNumber!) 
    { 
     central.connectPeripheral(peripheral, options: nil) 
     var pName=peripheral.name 
     println("\(pName):\(RSSI) dbm") 
     let defaults = NSUserDefaults.standardUserDefaults() 
     defaults.setObject("test", forKey: "variable") 
    } 
} 
+0

好吧,我把它放在viewDidLoad方法,像這樣:'覆蓋FUNC viewDidLoad中(){ 讓默認值= NSUserDefaults.standardUserDefaults() 讓名= defaults.stringForKey(」變量「) println(name) super.viewDidLoad()}'但我仍然得到'nil' –

+0

測試需要在BLEHandler類中定義,因爲這就是它的源頭實際上將被發現的地方......如果我在ViewController中定義它,那麼這看起來否定了NSUserDefaults的整個目的,因爲我可以用另一種方式訪問​​它,因爲引用將來自在f中定義'test'的同一個類中第一個地方... –

+0

gotcha!那麼在這種情況下,測試就起作用了。當我在同一個類中定義'test'時,我訪問它,NSUserDefaults工作得很好。但是當我在另一個類中定義'test'時,我得到'nil'。 –

回答

0

使用NSNotification。在BLEHandler中發佈通知,在viewController中添加觀察者,通過userInfo參數傳遞變量。

0

就像你說的,你用NSUserDefaults作爲存儲數據的方式。我想你可能會忘記Archived/UnArchived進程來打開存檔數據。

  • 將數據存儲到NSUserDefaults

    let defaults = NSUserDefaults.standardUserDefaults() 
    let test = NSKeyedArchiver.archivedDataWithRootObject(the instance of your Data Class) 
    defaults.setObject(test, forKey: "variable") 
    defaults.synchronize() 
    
  • NSUserDefaults中讀取數據。

    let defaults = NSUserDefaults.standardUserDefaults() 
    if let test = defaults.dataForKey("variable") { 
        let name = NSKeyedUnarchiver.unarchiveObjectWithData(test) as? Card 
        } 
    

希望我的回答可以幫助你。

0

在NSUserDefaults的設定值

NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "variable") 
//NSUserDefaults.standardUserDefaults().setObject(newValue as [NSString], forKey: "variable") 
NSUserDefaults.standardUserDefaults().synchronize() 

從NSUserDefaults的

Retrive數據
let name = NSUserDefaults.standardUserDefaults().objectForKey("variable") as? [NSString] 
+1

這不回答OP問題。順便說一句,他從來沒有問過如何保存一個NSString數組,並且沒有必要強制同步 –

+0

對不起,我的錯誤然後 –

+0

他的代碼來保存一個字符串是好的。他的問題是,他想要保存它的方法永遠不會被稱爲 –

-1

你的價值或NSUserDefault是零,因爲你需要設置值

let defaults = NSUserDefaults.standardUserDefaults() 
defaults.setObject("test", forKey: "variable") 
defaults.synchronize() 
+0

在這種情況下調用同步是不必要的並且可能不是問題。 https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/index.html#//apple_ref/occ/instm/NSUserDefaults/synchronize – Mike

+0

我認爲羅莎可以在此確認。我們使用ti有同樣的問題,並使用同步解決了我們的問題。 –

+0

http://stackoverflow.com/questions/9647931/nsuserdefaults-synchronize-method – Mike