我是新来的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")
}
}
好吧,我把它放在viewDidLoad方法,像这样:'覆盖FUNC viewDidLoad中(){ 让默认值= NSUserDefaults.standardUserDefaults() 让名= defaults.stringForKey(”变量“) println(name) super.viewDidLoad()}'但我仍然得到'nil' –
测试需要在BLEHandler类中定义,因为这就是它的源头实际上将被发现的地方......如果我在ViewController中定义它,那么这看起来否定了NSUserDefaults的整个目的,因为我可以用另一种方式访问它,因为引用将来自在f中定义'test'的同一个类中第一个地方... –
gotcha!那么在这种情况下,测试就起作用了。当我在同一个类中定义'test'时,我访问它,NSUserDefaults工作得很好。但是当我在另一个类中定义'test'时,我得到'nil'。 –