2017-09-01 3 views
0

MISE À JOUR:Swift 3 - délégué retourne toujours une valeur nulle

J'ai conçu tabBar personnalisé à l'aide des boutons. J'ai 3 onglets, Premier onglet a Messages icône, Deuxième a Le profil icône et la troisième a Photos icône. Pour le bouton du troisième onglet, j'ai utilisé uiCollectionView() où j'ai besoin de définir des images.

Pour le ViewController du troisième onglet, il y a une condition que je dois vérifier, avant de changer le title du premier bouton de tabulation. Si messagesJSON tableau n'est pas vide puis définir le titre "nouveau message" sur le premier bouton de l'onglet, sinon l'icône Messages ne changera pas.

Il y a un ParentTabViewController qui a ces 3 onglets, j'ai utilisé uiView, où je change le contenu en fonction des boutons de tabulation pressés. J'ai essayé d'accéder aux valeurs du 3ème onglet dans ParentTabViewController en utilisant le délégué, mais le délégué est toujours nul. Je l'ai fait comme ceci:

class ParentTabViewController: UIViewController,MessageDelegateProtocol{ 
@IBOutlet weak var contentView: UIView! 
@IBOutlet var tabBarButtons : [UIButton]! 
@IBOutlet weak var firstTabButton: UIButton! 
var MessageVC : UIViewController! 
var ProfileVC : UIViewController! 
var PhotosVC : UIViewController! 
var viewControllers : [UIViewController]! 
var message : String! 
var selectedIndex:Int = 0 
var photoVC = PhotosVC() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    photoVC.newMessageDelegate = self 

    let storyBoard = UIStoryboard(name:"Main", bundle:nil) 
    MessageVC = storyBoard.instantiateViewController(withIdentifier: "messagevc") 
    ProfileVC = storyBoard.instantiateViewController(withIdentifier: "profile") 
    PhotosVC = storyBoard.instantiateViewController(withIdentifier: "photos") 

    viewControllers = [MessageVC, ProfileVC, PhotosVC] 
    tabBarButtons[selectedIndex].isSelected = true 
    didPressTabs(tabBarButtons[selectedIndex]) 
} 
@IBAction func didPressTabs(_ sender: UIButton) 
{ 
    let previousIndex = selectedIndex 
    selectedIndex = sender.tag 
    tabBarButtons[previousIndex].isSelected = false 

    let previousVC = viewControllers[previousIndex] 

    previousVC.willMove(toParentViewController: nil) 
    previousVC.removeFromParentViewController() 
    previousVC.view.removeFromSuperview() 

    sender.isSelected = true 
    let presentVC = viewControllers[selectedIndex] 
    addChildViewController(presentVC) 

    presentVC.view.frame = contentView.bounds 
    contentView.addSubview(presentVC.view) 
    presentVC.didMove(toParentViewController: self) 

    if selectedIndex == 2{ // this is what I thought of doing.Correct me if wrong. 
    // check the condition 
    // if messagesArray != nil 
    // set the first tab title "new message" 
    } 
    else{ 
    // do not change the button image 
    } 
} 
func sendMessage(message : String) 
{ 
    self.message = message 
    print("message........", self.message, "\n\n") 
} 
} 

Voici le contrôleur View pour la 3ème onglet:

import UIKit 
protocol MessageDelegateProtocol:class { 
func sendMessage(message : String) 
} 

class PhotosVC: UIViewController,UICollectionViewDataSource, UICollectionViewDelegate{ 
@IBOutlet weak var collectionView: UICollectionView! 
var userMessageArray = [UserMessageClass]() // array of model class 
var newMessage : String! 
weak var newMessageDelegate : MessageDelegateProtocol? 

override func viewDidLoad() { 
    super.viewDidLoad() 
    collectionView.delegate = self 
    collectionView.dataSource = self 
    loadData()      // function to get json reponse 
} 
// implement collectionView delegate and dataSource methods 

func getData(newMsg : UserMessageClass) //func to get values from model class 
{ 
    newMessage = newMsg.messageString   // here I get the "new message" String 
    newMessageDelegate?.sendMessage(message: newMessage) 
} enter code here 

func loadData() 
{ 
    // get json response. And pass the payload to UserMessageClass using that class's array 
    userMessageArray.append(UserMessageClass(dict : jsonData)) 
    var msgData = UserMessageClass(dict: jsonData) 
    getData(alarm: msgData) 
} 
} 

J'ai essayé de chercher beaucoup sur l'accès à boutons de l'onglet dans un autre VC, mais n'a pas trouvé tout à proximité approche en tant que telle. Aussi je ne suis pas capable de comprendre pourquoi le délégué est toujours nul. Suggestions ou aide serait reconnaissant. Merci beaucoup :)

Répondre

1

Le problème est la ligne suivante.

let firstTab = storyBoard.instantiateViewController(withIdentifier: "parentVC") as! ParentViewController 

Vous vous attendez probablement à ce qu'il vous donne l'instance de ParentViewController que vous avez initialement configurée. Cependant, il vous donnera l'instance d'un ParentViewController nouvellement lancé qui n'est pas ce que vous voulez. Pour résoudre ce problème, vous pouvez utiliser un délégué ou un bloc d'achèvement défini qui sera défini dans votre classe ParentViewController.

Mise à jour: Essayez d'ajouter PhotosVC.newMessageDelegate = selfsous la ligne

PhotosVC = storyBoard.instantiateViewController(withIdentifier: "photos") 

changer aussi var PhotosVC : UIViewController!-var photosVC: PhotosVC!

Cela devrait fonctionner maintenant.

+0

Salut, Pouvez-vous s'il vous plaît montrez-moi comment le faire par délégué. Parce que ParentViewController, est chargé en premier et en ce que 'MessagesVC()' est le premier onglet. Lorsque je clique sur le 3ème onglet, et que je vérifie si le tableau json de 'messages' n'est pas nul, définissez le titre sur le 1er onglet. J'ai pensé à vérifier la condition dans ParentVC, 'si selectedIndex == 2 {// faire la vérification}' et ensuite définir le titre ici. Mais je n'ai pas réussi à obtenir les valeurs de MessagesVC dans ParentVc. devenir toujours nul. J'ai essayé par délégué mais j'ai échoué –

+0

Pouvez-vous télécharger votre projet sur github? – Rishab

+0

Salut, j'ai mis à jour la question. S'il vous plaît vérifier et suggérer ce qui ne va pas –