我是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")
}
}
答案 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()