2016-06-15 5 views
0

Это класс, где я определил протокол. Класс I, определяющий протокол, является NSObject (если это имеет значение).Протокол не работает даже после установки делегата

Класс A:

import UIKit 
import CoreBluetooth 

protocol deviceNameDelegate { 
    func discoveredDeviceName(deviceName: String, peripheral: CBPeripheral) 
} 

class BlueCoreManager: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate { 
... 
var del: deviceNameDelegate? 
... 
func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) { 

     if del != nil { 

      let peripheralName = peripheral.name! 
      let peripheralDevice = peripheral 
      print("Delegate is not nil") 
      del!.discoveredDeviceName(peripheralName, peripheral: peripheralDevice) 

     } else { 
      print("delegate is nil") 
     } 
... 
     } 
    } 

Класс B:

import UIKit 
import CoreBluetooth 

class availableDevicesViewController: UIViewController, deviceNameDelegate { 

    var ble = BlueCoreManager() 
... 
override func viewDidLoad() { 
     super.viewDidLoad() 

     ble.del = self 
} 

func discoveredDeviceName(deviceName: String, peripheral: CBPeripheral) { 
... 
    } 
} 

Я реализовал пользовательские протоколы дважды, но я действительно тупик на это. Я не могу понять, почему он не работает. Последующие шаги:

a. Я разработал протокол в классе А

b. Сделана дополнительная переменная делегата в классе А

c. Передача значений через делегата в классе А

d. Добавлен протокол к классу B и реализована функция, чтобы он соответствовал протоколу

e. Установите делегата из класса A как self (например, класс B)

Я все еще довольно новый, чтобы быстро, поэтому, возможно, я мог что-то пропустить. Кто-нибудь может просветить свет? Что я не делаю?

+0

используется для связи между дочерними и родительскими классами. –

+0

так вы говорите, что я не могу использовать протокол для общения здесь? – Jobs

+0

@Gagan_iOS Что вы имеете в виду? Это совершенно правильное использование делегатов. Между делегатом и делегатом не должно быть никаких конкретных отношений. – Paulw11

ответ

1

С вашей BlueCoreManager одноэлементно, вы никогда не должны создавать экземпляр его, как вы это делаете в своем контроллере.

Вы должны всегда использовать BlueCoreManager.shared(), чтобы получить экземпляр singleton.

Протокол
+0

@ Paulw11 Вы можете проверить этот вопрос. его также о протоколах, и ошибка аналогична, единственная разница заключается в ее протоколе в пределах uipageviewcontroller и панели инструментов. делегат показывает ноль. Никакой синглтон в этом вопросе. http://stackoverflow.com/questions/38330509/go-to-the-next-page-programmatically-within-a-uipageviewcontroller – Jobs

0

Есть несколько возможных причин для этого:
- вызов, чтобы обнаружить периферийные устройства выполняются и периферийные устройства, обнаруженные до вашего viewDidLoad, поэтому переменная del не установлен. Возможно, он находится в вашем BlueCoreManagerinit код, который выполняется, когда availableDevicesViewController инициализирован, задолго до того, как выполняется viewDidLoad.
- didDiscoverPeripheral вообще не вызывается - если некоторые сканеры не могут обнаружить какое-либо устройство.

я настоятельно рекомендую вам сделать делегат вар слабый вар, а не только по желанию:
weak var del: deviceNameDelegate?
, а также использовать OPTIONALS путь для которых они предназначены:
del?.discoveredDeviceName(peripheralName, peripheral: peripheralDevice)

+0

Я выполняю проверку перед del! .discoveredDeviceName (...), так что неважно – Jobs