This question seems to have a lot of strange answers. The truth is that there is no hacker way to change the image in an existing UIBarButtonItem. Instead, unfortunately, you need to recreate it. I made a helper method for this:
func changeBarButtonItemImage(_ item: UIBarButtonItem, image: UIImage, navItem: UINavigationItem) -> UIBarButtonItem? { let buttonItem = UIBarButtonItem(image: image, style: item.style, target: item.target, action: item.action) buttonItem.isEnabled = item.isEnabled if let leftIndex = navItem.leftBarButtonItems?.index(of: item) { var items: [UIBarButtonItem] = navItem.leftBarButtonItems! items[leftIndex] = buttonItem navItem.leftBarButtonItems = items return buttonItem } if let rightIndex = navItem.rightBarButtonItems?.index(of: item) { var items: [UIBarButtonItem] = navItem.rightBarButtonItems! items[rightIndex] = buttonItem navItem.rightBarButtonItems = items return buttonItem } return nil }
Using:
if let image = UIImage(named: showingFilter ? "icon_filter_active.png" : "icon_filter.png") { if let buttonItem = changeBarButtonItemImage(self.filterButton, image: image, navItem: navigationItem) { self.filterButton = buttonItem } }
Please note that I also copy the isEnabled property, because in my case, in some situations, I changed the button icon in the disabled state.
source share