Swift 3 - 重新加载 NavigationController 按钮图像

标签 swift image refresh uibarbuttonitem navigationitem

我有一个导航 Controller View ,带有一个嵌入式 collectionview Controller 。我以编程方式添加了一个右栏按钮,并添加了一张图片,如下所示:

    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 选项卡栏并使其与栏按钮的图像一起持续存在的方法?

#

编辑:以下是完整的按钮处理程序。

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

最佳答案

您的问题的答案在于这两个 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 */

因为根据你在评论部分的解释,如果我理解正确的话,是当你点击按钮时,图像会改变,然后你导航到不同的 View ,但随后当您返回时,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! 的值(我没有在您的代码中看到与此变量相关的任何设置)

关于Swift 3 - 重新加载 NavigationController 按钮图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44808644/

相关文章:

perl - Mechanize 以跟随元刷新链接

html - 如何将 HTML 标签添加到 UITextView Swift Xcode 中的字符串

swift - 如何使用 Swift 编写一个接受函数 f 和 float x 并将 f 应用于 x k 次的函数?

ios - 为什么我的嵌入式 YouTube 播放器不能自动播放?

arrays - 在 Swift 中处理可选变量和数组操作的更好方法

iOS 将多个图像复制到粘贴板

c# - 在电子邮件中发送内联图像

css - img 标签的奇怪行为

javascript - 自动刷新特定的 div 博主 javascript

Android Webview SwipeRefreshLayout