2016-01-08 2 views
0

У меня было рабочее приложение с компонентами 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? »(Что имеет смысл).

Я полностью вне сети идеи о том, как это исправить. Может кто-нибудь помочь?

Спасибо!

ответ

0

Вы должны использовать оператор, как? для дополнительных типажей. Ниже код должен работать,

let destinationVC = segue.destinationViewController as? DashboardViewController

+0

Спасибо! Теперь он компилируется. К сожалению, подключенное периферийное устройство, похоже, никогда не запускает какие-либо методы CBPeripheralDelegate в DashboardViewController (даже если я установил его как делегат), поэтому мне по-прежнему есть некоторая работа, чтобы посмотреть, что не так. Я начинаю думать, что вы просто должны иметь CBPeripheralDelegate в том же классе, что и CBCentralManagerDelegate. Если я решит свои проблемы, я все равно отправлю туда. – Bluetoother

Смежные вопросы