2017-06-28 2 views
1

私は、ナビゲーションビューを持ち、コレクションビューコントローラを内蔵しています。Swift 3 - Reload NavigationControllerボタン画像

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

私は銀にグレーからイメージを変更できるようにするには、このボタンをクリックするユーザーをしたいと思います次のように画像が追加して、私は右のバーボタンは、プログラムで追加されました。私は、ボタンのハンドラは、各プレスで銀に灰色から切り替えるように設定している:

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

しかし、画像だけでスイッチバックの前に簡単に変更します。私は画像の色を「フラグ」変数として保存しようとしました。つまり、現在グレーの場合は銀色に変えて変更を持続させますが、イメージはロードされたものに継続的にリセットされますviewDidLoadまたはviewWillAppearを使用して)。

クリックしたあとにnavigationControllerタブバーをリフレッシュ/リロードして、バーボタンの画像とともに保存してください。

EDIT:以下はフルボタンハンドラです。

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)") 
     } 

    } 

およびその他の機能:

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

イメージを更新した後、何らかの形で何秒かに戻ってきます。 –

+0

はい、新しい画像に切り替わります。次に、すぐに右に戻ります。私がタブを切り替えた後、戻っても正しく表示されますが、同じcollectionviewcontrollerタブの中には表示されません – Jeeves

+0

フルボタンクリックハンドラのコードを表示できますか? –

答えて

0

あなたの質問への答えは、この2 LIST_CoreDataBaseObjects.PatientsreturnTrueIfInFavoritesまたはpatientRecord変数内にあります。ので、私はそれを正しく理解場合は、コメント欄で説明してきたものから

どちらかLIST_CoreDataBaseObjects.Patientsはあなたの関数に更新されませんでしたhandleFavoritePressのコード

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

、あなたがタップときということですボタンを押して画像を変更した後、別のビューに移動した後、戻ると、viewDidAppear(_:)viewWillAppear(_:)がトリガーされます。コードブロックで、私は

// 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)) 
} 

これらのすべてを説明しますか、あなただけの変数self.patientRecord!の値を更新していないの下

は(私はこれに関連し、あなたのコード内の任意の設定を見ていません変数)

+0

あるタブから別のタブに前後に移動すると、イメージが適切に変更されます。その変更を生成しない現在のタブビュー内のボタンをクリックします。これらのタブ遷移でviewWillAppearがトリガされます。現在のビューのままでnavigationBarをトリガする方法を探しています。 – Jeeves

+0

あなたの関数 'handleGrayCircleButton'はどこにあるのでしょうか? –

関連する問題