繁体   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