2016-06-15 3 views
0

이것은 프로토콜을 정의한 클래스입니다. 프로토콜을 정의한 클래스는 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. A 클래스의 프로토콜 청사진을 만들었습니다

b. A 클래스에 선택적 대리자 변수를 만들었습니다.

c. A 클래스의 델리게이트를 통해 값 전달하기

d. 클래스 B에 프로토콜을 추가하고 프로토콜을 준수하도록 함수를 구현했습니다.

e. A 클래스의 델리게이트를 자체 클래스 (즉, 클래스 B)로 설정하십시오.

저는 아직 대단히 신속하므로 어쩌면 뭔가 놓친 것일 수 있습니다. 아무도 빛을 낼 수 있습니까? 나는 무엇을하지 않습니까?

+0

프로토콜은 하위 클래스와 상위 클래스 통신에 사용됩니다. –

+0

여기 프로토콜을 사용하여 통신 할 수 없다는 말씀입니까? – Jobs

+0

@Gagan_iOS 당신은 무엇을 의미합니까? 이것은 대표자를 완벽하게 사용할 수 있습니다. 대의원과 대표단 – Paulw11

답변

1

는 싱글 톤을, 뷰 컨트롤러 에서처럼 인스턴스를 생성해서는 안됩니다.

싱글 톤 인스턴스를 얻으려면 항상 BlueCoreManager.shared()을 사용해야합니다.

+0

@ Paulw11이 질문을 확인할 수 있습니까? 그것도 프로토콜에 관한 것이고 오류는 유사합니다. 유일한 차이점은 uipageviewcontroller와 툴바 내의 프로토콜입니다. 대의원은 아무 것도 보여주지 않습니다. 이 질문에 싱글 톤 없음. http://stackoverflow.com/questions/38330509/go-to-the-next-page-programmatically-within-a-uipageviewcontroller – Jobs

0

이 여러 가지 원인이 있습니다
- 주변 실행되고 주변 따라서 del 변수가 설정되어 있지, 당신의 viewDidLoad 전에 발견을 발견 호출합니다. 어쩌면 init 코드에있는 것일 수 있습니다. availableDevicesViewController이 초기화 될 때이 실행되기 훨씬 전에 실행됩니다.
- didDiscoverPeripheral이 전혀 호출되지 않습니다. 스캔이 어떤 장치를 감지하지 못하는 경우도 있습니다.

내가 강력하게 위임 VAR 단지 선택하지 약한 var를 만들 제안 :
weak var del: deviceNameDelegate?
뿐만 아니라 사용하는 등 그들이 의도하고있는 방법으로 선택적 항목 : 당신의 BlueCoreManager 이후
del?.discoveredDeviceName(peripheralName, peripheral: peripheralDevice)

+0

del! .discoveredDeviceName (...) 전에 확인을 수행 중이므로 상관 없습니다. – Jobs