投射实现协议的视图控制器
Casting View Controller that implements a protocol
我有一个在同一个视图控制器中包含 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" 的 2 个视图控制器之间设置了一个 segue。
此外,DashboardViewController 实际上是用于 TabBarController 的选项卡 - 不确定这是否有所不同。
所以我遇到的问题是我无法在标记为 ERROR 的行上将目标视图控制器转换为 DashboardViewController。这似乎是由实施 CBPeripheralDelegate 协议的 VC 引起的,就好像我删除它一样,然后我可以进行转换(但是这使得代码无用,因为我在那个 class 中需要它)。如果我转换为 UIViewController 而不是 DashboardViewController,则在下一行设置委托失败并显示 "Cannot assign value of type "UIViewController!" 以键入 "CBPeripheralDelegate?"(这是有道理的)。
我完全不知道如何解决这个问题。有人可以帮忙吗?
谢谢!
您应该使用 as? 运算符进行可选的类型转换。下面的代码应该可以工作,
let destinationVC = segue.destinationViewController as? DashboardViewController
我有一个在同一个视图控制器中包含 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" 的 2 个视图控制器之间设置了一个 segue。
此外,DashboardViewController 实际上是用于 TabBarController 的选项卡 - 不确定这是否有所不同。
所以我遇到的问题是我无法在标记为 ERROR 的行上将目标视图控制器转换为 DashboardViewController。这似乎是由实施 CBPeripheralDelegate 协议的 VC 引起的,就好像我删除它一样,然后我可以进行转换(但是这使得代码无用,因为我在那个 class 中需要它)。如果我转换为 UIViewController 而不是 DashboardViewController,则在下一行设置委托失败并显示 "Cannot assign value of type "UIViewController!" 以键入 "CBPeripheralDelegate?"(这是有道理的)。
我完全不知道如何解决这个问题。有人可以帮忙吗?
谢谢!
您应该使用 as? 运算符进行可选的类型转换。下面的代码应该可以工作,
let destinationVC = segue.destinationViewController as? DashboardViewController