2017-06-28 19 views
1

我有一個導航控制器視圖,帶有嵌入式collectionview控制器。我有加入編程右欄按鈕,與圖像添加到它如下:Swift 3 - 重新加載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)。

無論如何刷新/重新載入導航控制器標籤欄後,每次點擊並使其持續,連同圖像的酒吧按鈕?

編輯:以下是完整的按鈕處理程序。

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

是的,它會切換到新圖像,然後短暫地返回。如果我切換標籤,然後返回,它會正確顯示,但不會在仍處於同一個collectionview控制器選項卡內 – Jeeves

+0

您能告訴我們您的完整按鈕點擊處理程序的代碼嗎? –

回答

0

的回答你的問題就在於內這兩LIST_CoreDataBaseObjects.PatientsreturnTrueIfInFavoritespatientRecord變量。

要麼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

從一個標籤到另一個標籤來回導航會對圖像產生適當的更改;它單擊當前tabView中不會產生更改的按鈕。 viewWillAppear在這些選項卡轉換上被觸發 - 我正在尋找一種方式來觸發導航欄,同時仍處於當前視圖中。 – Jeeves

+0

好的。你的函數'handleGrayCircleButton'在哪裏顯示? –