NSUserDefaults创建全局可访问变量

时间:2015-04-19 03:11:07

标签: ios swift nsuserdefaults

我是swift和iOS的新手。我正在为一个高中项目开发应用程序。我有两个文件,每个文件都定义了一个类。 ViewController有一个同名的类,和BLEHandler,有一个类BLEManager和另一个BLEHandler。

BLEHandler外出并扫描广告BLE设备并收集这些设备的UUID并将其打印出来。现在,我用UUID代替“变量”。

我希望能够在按下按钮(在ViewController中设置)时将“变量”的值打印到控制台。这意味着我需要在BLEHandler中访问ViewController中的“变量”值。

此处给出了我在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 ... 有什么建议吗?

提前致谢!

编辑:以下是目前的完整代码:

  

VIEWCONTROLLER CLASS:

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 CLASS:

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")
    }
}

4 个答案:

答案 0 :(得分:0)

使用NSNotification。在BLEHandler中发布通知,在viewController中添加观察者,通过userInfo参数传递变量。

答案 1 :(得分: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
        }
    

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

答案 2 :(得分:0)

在NSUserDefaults中设置值

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

从NSUserDefaults

中检索数据
 let name = NSUserDefaults.standardUserDefaults().objectForKey("variable") as? [NSString]

答案 3 :(得分:-1)

您的值或NSUserDefault为零,因为您需要在设置值后同步它

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