2016-06-14 8 views
0

Ich habe eine Delegation/Initialisierung Problem kann ich nicht zu lösen scheinen. Grundsätzlich habe ich ein Storyboard mit ein paar View-Controllern. Im Storyboard befindet sich dieser "View-Controller", der aus einer UITableview besteht, die ich mit einer DeviceListViewController-Klasse verbunden habe, um die Informationen zu füllen. Hier habe ich das folgende Protokoll erklärt:Delegation in einer Klasse in Swift

protocol DeviceListViewControllerDelegate: UIAlertViewDelegate { 
    var connectionMode:ConnectionMode { get } 
    func connectPeripheral(peripheral:CBPeripheral, mode:ConnectionMode) 
    func stopScan() 
    func startScan() 
} 

und innerhalb der Klasse selbst ich habe eine init Methode wie folgt (was wahrscheinlich falsch ist, aber ich wusste nicht, was ich sonst an dieser Stelle tun könnte):

convenience init(aDelegate: DeviceListViewControllerDelegate) { 

    self.init() 

    self.delegate = aDelegate 
} 

Dann gibt es diese zweite Klasse, die nicht mit einem View-Controller namens BLEMainViewController verbunden ist. Es sollte ein Singleton sein, der alle Bluetooth-Aktionen behandelt. Das bedeutet, dass ich in der Lage sein sollte, etwas zwischen DevicelistViewController und BLEMainViewController zu delegieren.

Im BLEMainViewController ich die DeviceListViewControllerDelegate geerbt haben:

class BLEMainViewController: NSObject, DeviceListViewControllerDelegate { 

    var deviceListViewController:DeviceListViewController! 
    var delegate: BLEMainViewControllerDelegate? 
    static let sharedInstance = BLEMainViewController() 

} 

override init() { 
    super.init() 
    //  deviceListViewController.delegate = self 
    deviceListViewController = DeviceListViewController(aDelegate: self) 
} 

Das Problem ist, dass BLEMainViewController nicht an View-Controller angeschlossen ist (und es sollte nicht IMO), aber es muss als Singleton initialisiert werden in um alle BLE-Aktionen zu bearbeiten. Kann mir jemand in die richtige Richtung (mit einem Beispiel vorzugsweise) zeigen, wie man das umgeht?

Setup

+0

hilft so, warum haben Sie es einen Controller Ansicht gemacht? – Wain

+0

Nun, ich musste das tun, um Alerts usw. zu zeigen, aber ich dachte nur, dass das eigentlich wirklich dumm ist:/ – Reshad

+0

Ich habe jetzt eine normale Klasse daraus gemacht. – Reshad

Antwort

0

Ich glaube, Sie einfach falsche Code-Architektur verwendet.

Die BLEManager ist eine gemeinsame Instanz, können Sie es von überall her aufrufen können, stellen sie Eigenschaften und seine Methoden aufrufen. Seine Ihre View-Controller mit allen möglichen vordefinieren Ereignisse delegieren Sie zu seinem Protokoll hinzufügen und die ordnungsgemäße Umsetzung bieten

Hier ist ein Code, hoffen, dass es

protocol BLEManagerDelegate{ 
    func bleManagerDidStartScan(manager : BLEManager) 
} 

class BLEManager: NSObject { 
    static let sharedInstance = BLEManager() 

    var delegate: BLEManagerDelegate? 
    var devices : [AnyObject] = [] 

    func startScan(){ 
     delegate?.bleManagerDidStartScan(self) 
     //do what ever 
    } 

    func stopScan(){ 

    } 
} 
+0

Also ich habe den DeviceListViewController und sein Protokoll. Was mein BLEManager tun sollte, ist diese Protokollmethoden zu handhaben. (also muss ich diese an den BLEManager delegieren) Aber ich kann nicht aus deinem Code ersehen, wie man die Delegation richtig einstellt – Reshad

Verwandte Themen