2017-04-05 2 views
0

Mon application dispose d'un contrôleur de vue principale dans lequel les informations d'un périphérique Bluetooth sont affichées. Pour me connecter au périphérique bluetooth, je passe à un contrôleur de vue différent pour me connecter au périphérique Bluetooth désiré. Je suis alors abonné à ce périphérique bluetooth qui appelle une fonction chaque fois que le périphérique bluetooth envoie des données. Après avoir sélectionné le périphérique auquel je souhaite me connecter, je passe à l'écran principal où je souhaite afficher les données que je reçois. Je peux voir que les événements de réception de paquets provenant du périphérique bluetooth fonctionnent toujours après le retour à l'écran principal avec des impressions dans le code du contrôleur secondaire.IOS Swift, délégué pour communiquer entre deux contrôleurs de vue

Mon problème est que je veux prendre ces données reçues dans mon deuxième contrôleur de vue et l'envoyer au contrôleur de vue principal chaque fois que je le reçois. Comme je ne peux pas utiliser les segments parce que je ne reviens pas sur le contrôleur secondaire, j'ai décidé d'utiliser le délégué pour communiquer.

Voici ce que j'ai ajouté à ce jour dans le deuxième contrôleur de vue, celui d'envoyer les données:

Dans contrôleur de vue secondaire, avant la classe:

protocol sendLatLonDelegate : class{ 
    func sendReceiveData(data:AnyObject?) 
} 

Au sommet de mon point de vue secondaire classe de contrôleur avec mes autres variables

weak var delegate:sendLatLonDelegate? 

Dans la fonction qui est appelée lorsque je reçois un paquet de mon appareil bluetooth

delegate?.sendReceiveData(latFloat) 

Voici ce que j'ai ajouté dans mon principal contrôleur de vue, celui qui reçoit les données:

a ajouté à la définition de classe

class ViewController: UIViewController,sendLatLonDelegate { 

Et dans ma classe ajouté

func sendReceiveData(data:AnyObject?) {  
    print("received data") 
} 

J'imprime la valeur des données reçues avant d'essayer de l'envoyer au contrôleur de la vue principale et je peux le voir correctement. Cependant, je ne vois pas mes données imprimées.

C'est probablement un petit lien que je ne réalise pas que je manque entre les deux mais je n'arrive pas à trouver ce que c'est. Quelqu'un a des suggestions? Merci beaucoup!

Edit: De recommandation dans les réponses, a ajouté

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) 
{ 
    if (segue.identifier == "ConnectDeviceSegue") 
    { 
     let mapViewController = segue.destinationViewController as! ViewController 
     mapViewController.delegate = self 

    } 
} 

maintenant obtenir l'erreur Valeur de type 'ViewController' n'a pas membre 'délégué' à la ligne mapViewController.delegate = self

+0

Eh bien, avez-vous défini le VC de réception en tant que délégué? – Losiowaty

+0

@Losiowaty Votre deuxième contrôleur ne reçoit aucune valeur de délégué et passe à zéro. Vous devez envoyer un délégué du premier contrôleur au second contrôleur. –

+0

@Losiowaty Je n'ai pas, donc je suppose que c'est probablement ce qui manque. Pourriez-vous me donner un exemple d'où et comment je devrais faire cela? En regardant brièvement, je pense que j'ai besoin d'obtenir une instance de la VC de réception dans mon VC d'envoi et de définir comme le délégué là-bas, mais je ne suis pas sûr de savoir comment s'y prendre. Merci! – lhbortho

Répondre

1

Ok, donc de commentaires nous avons obtenu que vous n'avez pas défini la propriété delegate, et à partir de la question, nous savons que vous utilisez des segues. Pour définir la propriété que vous devez remplacer une méthode dans votre ViewController (la première):

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if (segue.identifier == "ConnectDeviceSegue") { 
     let mapViewController = segue.destinationViewController as! DeviceJoinViewController 
     mapViewController.delegate = self 

    } 
} 

Ceci suppose bien entendu, que votre deuxième VC est nommé SecondViewController - sinon, changer cette partie en conséquence.

+0

Merci pour la réponse, j'ai édité le code dans ma question initiale, je crois que j'utilise une version différente de swift donc c'est légèrement différent de votre réponse. Je reçois actuellement l'erreur "valeur de type" ViewController "n'a pas de membre 'délégué'" – lhbortho

+0

Il semble que vous vous trompez - vous devez le mouler au type de la deuxième vue contrôleur, celui qui a le ' déléguer la propriété. D'après ce que je comprends et que vous comprenez de votre code, vous le transmettez au contrôleur de première vue. – Losiowaty

+0

Le conteneur virtuel d'envoi s'appelle DeviceJoinViewController, celui qui reçoit est appelé ViewController. J'ai utilisé cette même fonction pour accéder aux variables dans ViewController et cela a fonctionné donc je ne suis pas sûr que ce soit le problème. (C'est peut-être aussi ce que je comprends de votre réponse) – lhbortho