我正在尝试创建一个BLE应用程序,因为我正在编写代码和示例,我发现最佳实践是将所有BLE功能保存在自己的.swift文件中,只需从视图控制器访问它,这项工作正常,但我遇到了一个非常具体的问题:
我有一个标签式应用程序,它有一个禁用选项卡(除非它连接到设备)。目的是只有在与设备配对后才能启用此菜单或项目集,因此我在MainViewController.swift中创建了一个方法,如下所示:
func enableDeviceTab()
{
tabBarController?.tabBar.items?[1].badgeValue = "!"
tabBarController?.tabBar.items?[1].isEnabled = true
print("Enabling Device Tab")
}
如果我从MainViewController中运行它,这可以正常工作,但是如果我转到我的BLEManager.swift文件,我试图以下面的方式运行,我不确定它是最合适的(我确实得到了)打印消息,但选项卡未启用):
var mainVC = MainViewController()
class BLEManager {
var centralManager : CBCentralManager!
var bLEHandler : BLEHandler // this will be the delegate
init() {
self.bLEHandler = BLEHandler()
self.centralManager = CBCentralManager(delegate: self.bLEHandler, queue: nil)
}
}
class BLEHandler : NSObject, CBCentralManagerDelegate, CBPeripheralDelegate {
override init() {
super.init()
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
// CODE THAT WORKS
}
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
print("Connected to device!")
displayStatusAlert(localmsg: "Connection Successful!")
mainVC.enableDeviceTab()
}
注意:我没有复制粘贴整个东西所以可能有一个或两个缺失,忽略这一点,唯一相关的行(我认为)如下:
var mainVC = MainViewController()
和
mainVC.enableDeviceTab()
答案 0 :(得分:1)
您似乎对文件或类与该文件中定义的类型实例之间的区别感到困惑。 var mainVC = MainViewController()
正在创建一个新的MainViewController
,它与您在标签栏控制器中看到的视图完全独立。因此,您在控制器上调用enableDeviceTab
,该控制器的值为tabBarController
。
在这种情况下,仅知道要与之通信的类型是不够的。您需要引用到要修改或调用行为的特定类型的实例。