У меня было рабочее приложение с компонентами CBCentralManager и CBPeripheral в одном контроллере представления, но теперь вы хотите отделить логику, чтобы я мог иметь отдельный экран подключения. Мой план состоял в том, чтобы создать CBCentralManager на странице подключения, обнаружить & соединить периферию, перейдите на страницу панели мониторинга, а затем используйте там CBPeripheral.Кастинг View Controller, который реализует протокол
Мой код (урезанная) выглядит следующим образом:
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
}
У меня есть SEGUE установить между 2 контроллерами отображения с идентификатором "connectedPeripheralSegue".
Кроме того, DashboardViewController фактически является вкладкой TabBarController - не уверен, что это имеет значение.
Таким образом, проблема заключается в том, что я не могу использовать контроллер представления назначения как DashboardViewController в строке с надписью ERROR. По-видимому, это вызвано тем, что VC реализует CBPeripheralDelegate Protocol, как если бы я его удалял, тогда я могу использовать (однако это делает код бесполезным, поскольку мне это нужно в этом классе). Если я перейду на UIViewController вместо DashboardViewController, то установка делегата на следующей строке завершится сбоем с помощью «Невозможно присвоить значение типа« UIViewController! »Для ввода типа« CBPeripheralDelegate? »(Что имеет смысл).
Я полностью вне сети идеи о том, как это исправить. Может кто-нибудь помочь?
Спасибо!
Спасибо! Теперь он компилируется. К сожалению, подключенное периферийное устройство, похоже, никогда не запускает какие-либо методы CBPeripheralDelegate в DashboardViewController (даже если я установил его как делегат), поэтому мне по-прежнему есть некоторая работа, чтобы посмотреть, что не так. Я начинаю думать, что вы просто должны иметь CBPeripheralDelegate в том же классе, что и CBCentralManagerDelegate. Если я решит свои проблемы, я все равно отправлю туда. – Bluetoother