我在同一个视图控制器中有一个包含CBCentralManager和CBPeripheral组件的可运行应用程序,但是现在希望分离逻辑,以便可以有一个单独的连接屏幕。我的计划是在“连接”页面上创建CBCentralManager,发现并连接外围设备,选择到“仪表板”页面,然后在那儿使用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
}
我在两个带有标识符“ connectedPeripheralSegue”的视图控制器之间设置了segue。
另外,DashboardViewController实际上是用于TabBarController的选项卡的-不知道这是否有所不同。
所以我得到的问题是我无法在标记为ERROR的行上将目标视图控制器转换为DashboardViewController。这似乎是由实现CBPeripheralDelegate协议的VC引起的,好像我删除了它,然后就可以进行强制转换(但是这会使代码无用,因为我在该类中需要此代码)。如果我强制转换为UIViewController而不是DashboardViewController,则在下一行设置委托将失败,并出现“无法分配类型为“ UIViewController!”的值来键入类型为“ CBPeripheralDelegate?”(有意义))。
我完全不知道如何解决此问题。有人可以帮忙吗?
谢谢!
最佳答案
您应该用作?可选类型转换的运算符。下面的代码应该工作, let destinationVC = segue.destinationViewController as? DashboardViewController