gpt4 book ai didi

ios - 在 BluetoothManager Delegate 类中访问 ViewController 按钮

转载 作者:行者123 更新时间:2023-11-28 06:36:23 25 4
gpt4 key购买 nike

因此,我刚刚开始使用 Swift 语言 (v2.2) 使用 XCode (v7.3),并且我正在尝试编写一个单页应用程序,该应用程序将通过按下按钮连接到目标 BLE 设备。

我遵循了以下网站上关于核心蓝牙框架的简短教程:http://hatemfaheem.blogspot.com/2014/12/how-would-you-scan-for-nearby-ble.html

这让我创建了以下类结构:

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) {
var status:String
switch(central.state) {
case .PoweredOn
status = "Powered On"
//ble_show()
case .PoweredOff
status = "Powered Off"
//ble_hide()
}//Note: several cases have been omitted to reduce length
print(status)
}
}

var bleManager = BLEManager()

插入这些类定义并在我的 ViewController.swift 文件的 ViewController 类中声明 BLEManager 类的实例后,我可以在打开蓝牙时在控制台中看到字符串“Powered On”和“Powered Off”在运行该应用程序时在我的 iPhone 上打开和关闭。

问题是当我调用上面代码中名为“ble_show()”和“ble_hide”的函数时出现错误(这就是它们被注释掉的原因)。我认为问题是因为这些函数是总体 ViewController 类的成员,您不能只从嵌套类 BLEHandler 内部调用这些函数。

ble_show() 和 ble_hide() 函数只是为按钮设置“隐藏”标志以将其显示给用户。我希望这些按钮仅在用户打开蓝牙时可用。所以 BLEHandler 类需要以某种方式访问​​在 ViewController 类中声明的这些按钮,但我似乎不明白该怎么做。我尝试将我所有的函数声明和 UIButton 声明移动到 BLEHandler 类中,但是当我这样做时 XCode 真的不喜欢它。

我的部分问题是我同时学习 Swift、XCode 和核心蓝牙框架,所以如果有人能解释如何尽可能彻底地完成我正在尝试的事情,那将非常有帮助。我习惯于在具有简单 main() 函数的环境中进行编程,而不是将类用作 main()(这是我目前处理 ViewController 类的方式)。

如果我理解正确,CBCentralManagerDelegate 会将我的部分代码注册到一个事件,每当蓝牙状态发生变化时,该事件就会调用我的 CentralManagerDidUpdateState() 成员函数。但是当这些事件发生时,我该如何告诉我的 ViewController 做些什么呢?

最佳答案

通过将蓝牙管理器与 View Controller 分开(这是一个很好的设计),您无法直接更新 View Controller 中的项目。您可以使用 NSNotification 或协议(protocol)/委托(delegate)来通知您的 View Controller 蓝牙状态更改。

由于可能有很多对象对蓝牙事件感兴趣,所以在这种情况下我会使用 NSNotification。

在您的 ViewController 类中,您可以为特定通知注册一个观察者:

override func viewDidLoad() {
super.viewDidLoad()

let notificationCenter = NSNotificationCenter.defaultCenter()

notificationCenter.addObserver(self, selector: #selector(ViewController.bluetoothChanged(_:)), name: "bleStateChange", object: nil)
}

@objc func bluetoothChanged(notification: NSNotification) {

if let status = notification.userInfo["statusString"] as? String {
print("Bluetooth status = \(status)")
}
}

在您的 BLEManager 中,您需要发布通知:

func CentralManagerDidUpdateState(central: CBCentralManager) {
var status:String
switch(central.state) {
case .PoweredOn
status = "Powered On"
//ble_show()
case .PoweredOff
status = "Powered Off"
//ble_hide()
}//Note: several cases have been omitted to reduce length
print(status)
let notificationCenter = NSNotificationCenter.defaultCenter()
let userInfo = ["statusString":"powered off","centralState":central.state.rawValue] as [String:AnyObject]
notificationCenter.postNotificationName("bleStateChange", object: nil, userInfo: userInfo)
}

关于ios - 在 BluetoothManager Delegate 类中访问 ViewController 按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38987259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com