Casting View Controller实现协议

时间:2016-01-08 10:26:14

标签: ios swift core-bluetooth

我在同一个视图控制器中有一个带有CBCentralManager和CBPeripheral组件的工作应用程序,但现在希望将逻辑分开,以便我可以拥有一个单独的连接屏幕。我的计划是在连接页面上创建CBCentralManager,发现&将外围设备,segue连接到仪表板页面,然后在那里使用CBPeripheral。

我的代码(剥离)如下:

var globalBTDevice : CBPeripheral! // Only using this as a global variable because I can't get this to pass using prepareForSegue

class ConnectionPageViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, CBCentralManagerDelegate {
    var centralManager : CBCentralManager!

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        globalBTDevice = self.allFoundDevices[indexPath.row]
        centralManager.stopScan()

        self.performSegueWithIdentifier("connectedPeripheralSegue", sender: self)
    }


    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
        if segue.identifier == "connectedPeripheralSegue" {
            let destinationVC = segue.destinationViewController as DashboardViewController! // ERROR here: cannot convert value of type "UIViewController" to type "DashboardViewController!" in coercion.
            globalBTDevice.delegate = destinationVC
        }
        centralManager.connectPeripheral(globalBTDevice, options: nil)
    }
}

class DashboardViewController: UIViewController, CBPeripheralDelegate {
    // All delegate methods implemented here
}

我在2个视图控制器与标识符" connectedPeripheralSegue"之间设置了一个segue。

此外,DashboardViewController实际上是用于TabBarController的选项卡 - 不确定这是否有所不同。

所以我得到的问题是我无法在标记为ERROR的行上将目标视图控制器转换为DashboardViewController。它似乎是由VC实现CBPeripheralDelegate协议引起的,好像我删除它,然后我可以强制转换(但是这会使代码无用,因为我需要在该类中使用它)。如果我转换为UIViewController而不是DashboardViewController,那么在下一行设置委托将失败,并且#34;无法分配类型" UIViewController的值!"输入" CBPeripheralDelegate?" (这很有意义)。

我完全不知道如何解决这个问题。有人可以帮忙吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您应该使用 as?运算符进行可选的类型转换。下面的代码应该可行,

let destinationVC = segue.destinationViewController as? DashboardViewController