从另一个文件Swift / Xcode调用时,函数将无法完全执行

时间:2017-09-06 22:40:37

标签: ios swift xcode

我正在尝试创建一个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()

1 个答案:

答案 0 :(得分:1)

您似乎对文件或类与该文件中定义的类型实例之间的区别感到困惑。 var mainVC = MainViewController()正在创建一个新的MainViewController,它与您在标签栏控制器中看到的视图完全独立。因此,您在控制器上调用enableDeviceTab,该控制器的值为tabBarController

在这种情况下,仅知道要与之通信的类型是不够的。您需要引用到要修改或调用行为的特定类型的实例。