Casting View Controller, который реализует протокол

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

У меня совершенно нет идей, как это исправить. Кто-нибудь может помочь?

Спасибо!


person Bluetoother    schedule 08.01.2016    source источник


Ответы (1)


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

let destinationVC = segue.destinationViewController as? DashboardViewController

person Vasu N    schedule 08.01.2016
comment
Благодарю вас! Теперь он компилируется. К сожалению, подключенное периферийное устройство, похоже, никогда не запускает какие-либо методы CBPeripheralDelegate в DashboardViewController (даже когда я установил его в качестве делегата), поэтому мне еще предстоит проделать некоторую работу, чтобы увидеть, что не так. Я начинаю думать, что вам просто нужно иметь CBPeripheralDelegate в том же классе, что и CBCentralManagerDelegate. Если я решу свои проблемы, я все равно отпишусь здесь. - person Bluetoother; 09.01.2016