У меня было рабочее приложение с компонентами 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».
Кроме того, DashboardViewController на самом деле предназначен для вкладки TabBarController - не уверен, что это имеет значение.
Итак, проблема, которую я получаю, заключается в том, что я не могу использовать целевой контроллер представления как DashboardViewController в строке с пометкой ERROR. Кажется, это вызвано тем, что VC реализует протокол CBPeripheralDelegate, как будто я удаляю это, тогда я могу выполнить приведение (однако это делает код бесполезным, так как мне это нужно в этом классе). Если я приведу к UIViewController вместо DashboardViewController, то установка делегата в следующей строке завершится ошибкой: «Невозможно присвоить значение типа «UIViewController!» Типу «CBPeripheralDelegate?» (что имеет смысл).
У меня совершенно нет идей, как это исправить. Кто-нибудь может помочь?
Спасибо!