2015-04-19 95 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