簡體   English   中英

Swift 3-重新加載NavigationController按鈕圖像

[英]Swift 3 - Reload NavigationController Button Image

我有一個導航控制器視圖,並帶有嵌入式collectionview控制器。 我以編程方式添加了一個右鍵欄按鈕,並向其中添加了一個圖像,如下所示:

    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選項卡欄並使之持久化,以及欄按鈕的圖像?

編輯:以下是全按鈕處理程序。

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

等功能:

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

您問題的答案在這兩個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! 的值(我在您的代碼中未看到與此變量相關的任何設置)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM