2017-06-28 2 views
1

J'ai une vue de contrôleur de navigation, avec un contrôleur intégré de collection. J'ai un bouton de la barre à droite est ajouté par programme, avec une image ajoutée comme suit:Swift 3 - Bouton Reload NavigationController Image

self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "greyCircle").withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector (handleGrayCircleButton)) 

Je voudrais un utilisateur qui clique sur ce bouton, pour être en mesure de changer l'image du gris à l'argent. Je le gestionnaire de bouton mis en place pour passer de gris à l'argent à chaque pression:

 self.navigationItem.rightBarButtonItem?.image = UIImage(named: "greyCircle") 

Cependant, l'image change seulement brièvement avant de basculer en arrière. J'ai essayé d'enregistrer la couleur de l'image en tant que variable 'flag', c'est-à-dire si elle est actuellement grise, passer à l'argent, pour que le changement persiste, cependant, l'image se réinitialise continuellement avec viewDidLoad ou viewWillAppear).

Y at-il un moyen de rafraîchir/recharger la barre d'onglets navigationController après chaque clic et de la faire durer, ainsi que les images des boutons de la barre?

#

EDIT: La suite est un gestionnaire de boutons complet.

func handleFavoritePress(){ 
     print("Favorites pressed") 
     if(!returnTrueIfInFavorites(objectName: readString(object: self.patientRecord!, key: "name"), objectType: LIST_CoreDataBaseObjects.Patients)){ 
      // Add to favorites 
      Favorites_Names.append(readString(object: self.patientRecord!, key: "name")) 
      Favorites_Types.append(LIST_CoreDataBaseObjects.Patients) 


      // Let user know 
      let patientName = readString(object: self.patientRecord!, key: "name") 
      let alertController = UIAlertController(title: "Alert!", message: "\(patientName) has been added to your favorites.", preferredStyle: .alert) 
      let defaultAction = UIAlertAction(title: "OK", style: .default, handler: nil) 
      alertController.addAction(defaultAction) 
      var rootViewController = UIApplication.shared.keyWindow?.rootViewController 
      if let navigationController = rootViewController as? UINavigationController { 
       rootViewController = navigationController.viewControllers.first 
      } 
      if let tabBarController = rootViewController as? UITabBarController { 
       rootViewController = tabBarController.selectedViewController 
      } 
      rootViewController?.present(alertController, animated: true, completion: nil) 
      self.navigationItem.rightBarButtonItem?.image = UIImage(named: "savedFavorite_1") 

     }else{ 

      self.navigationItem.rightBarButtonItem?.image = UIImage(named: "favorite_2") 
      deleteFromFavorites(objectName: readString(object: patientRecord!, key: "name"), objectType: LIST_CoreDataBaseObjects.Patients) 
     } 
     for favorite in Favorites_Names{ 
      print("Favorites are currently: \(patient)") 
     } 

    } 

et d'autres fonctions:

override func viewWillAppear(_ animated: Bool) { 

     collectionView?.backgroundView = setBackgroundImage(imageName: "whiteBackground") 
     navigationItem.title = "Patient" 
     if(returnTrueIfInFavorites(objectName: readString(object: patientRecord!, key: "name"), objectType: LIST_CoreDataBaseObjects.Patients)){ 
      setupNavBarButtonsIsFavorited() 
     }else{ 
      setupNavBarButtonsNotFavorited() 
     } 
    } 

    func setupNavBarButtonsNotFavorited(){ 
     self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "favorite_2").withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector (handleFavoritePress)) 
    } 
    func setupNavBarButtonsIsFavorited(){ 
     self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "savedFavorite_1").withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector (handleFavoritePress)) 
    } 
+0

Vous voulez dire que, après avoir mis à jour l'image, il se remettra, disons, en quelques secondes? –

+0

Oui, il passe à la nouvelle image, brièvement puis à droite. Si je change d'onglet, puis de retour, il s'affiche correctement, mais pas encore dans le même onglet de collectionviewcontroller – Jeeves

+0

Pouvez-vous nous montrer le code de votre gestionnaire de clic complet, s'il vous plaît? –

Répondre

0

La réponse à votre question se trouve dans ce deux LIST_CoreDataBaseObjects.Patients, returnTrueIfInFavorites ou la variable patientRecord.

Soit LIST_CoreDataBaseObjects.Patients ne pas mis à jour sur votre fonction handleFavoritePress « s Code

/* this code */ 
Favorites_Names.append(readString(object: self.patientRecord!, key: "name")) 
Favorites_Types.append(LIST_CoreDataBaseObjects.Patients) 
/* this code */ 

Parce que de ce que vous avez expliqué dans la section des commentaires, si je comprends bien, est que lorsque vous robinet la bouton l'image change, puis vous accédez à une vue différente, mais lorsque vous revenez, viewDidAppear(_:) et viewWillAppear(_:) seront déclenchés.

qui, dans le bloc de code ci-dessous je vais vous expliquer

// this function will be triggered everytime you navigate into this view (because it has appeared) 
override func viewWillAppear(_ animated: Bool) { 
    /* don't forget to call super.viewWillAppear(true) */ 
    super.viewWillAppear(true) 
    /* don't forget to call super.viewWillAppear(true) */ 

    collectionView?.backgroundView = setBackgroundImage(imageName: "whiteBackground") 

    navigationItem.title = "Patient" 

    // the problem lies here 
    /* the function `(returnTrueIfInFavorites(objectName: readString(object: patientRecord!, key: "name"), objectType: LIST_CoreDataBaseObjects.Patients))` is always returning one thing which is why your image returns back to its previous state */ 
    if (returnTrueIfInFavorites(objectName: readString(object: patientRecord!, key: "name"), objectType: LIST_CoreDataBaseObjects.Patients)) { 
     setupNavBarButtonsIsFavorited() // only one of these gets called 
    } else { 
     setupNavBarButtonsNotFavorited() // only one of these gets called 
    } 
} 

func setupNavBarButtonsNotFavorited() { 
    self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "favorite_2").withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector (handleFavoritePress)) 
} 

func setupNavBarButtonsIsFavorited() { 
    self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "savedFavorite_1").withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector (handleFavoritePress)) 
} 

Tous ces ou vous êtes tout simplement pas mettre à jour la valeur de la self.patientRecord! variable (je n'ai pas vu un paramètre dans votre code relatif à cette variable)

+0

La navigation d'un onglet à l'autre produit le changement approprié à l'image; c'est en cliquant sur le bouton à l'intérieur de l'onglet actuel qui ne produit pas la modification. viewWillAppear est déclenché sur ces transitions d'onglets - Je cherche un moyen de déclencher le navigationBar tout en restant dans la vue actuelle. – Jeeves

+0

Ok. où est votre fonction 'handleGrayCircleButton' s'il vous plaît montrez-le sur la question. –