0

I'm writing an extension by taking a swift file and did codes in following way:

import Foundation
import UIKit

extension UIButton{

    func backButtonTarget(_ target: Any, action: Selector) -> UIBarButtonItem {
        let backButton = UIButton(frame: CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(12), height: CGFloat(20)))
        backButton.setBackgroundImage(UIImage(named: "back.png"), for: .normal)
        let barBackButtonItem = UIBarButtonItem(customView: backButton)
        backButton.addTarget(target, action: action, for: .touchUpInside)
        return barBackButtonItem
    }


}

Now, I tried to use it by declaring a button in my viewcontroller where i need that by following way:

var backButton: UIButton! = nil

and in my viewDidLoad I'm declaring the following code:

self.navigationItem.leftBarButtonItem = backButton?.backButtonTarget(self, action: #selector(self.popCurrentViewController))

and in popCurrentViewController

func popCurrentViewController() -> Void {

            _ = self.navigationController?.popViewController(animated: true)

    }

Here, by declaring above code, UINavigationBar leftbar item button should show as per my created button, but it is not showing neither it enter into the extension function either, but perfectly working on Objective c codes by using category, Where i'm doing wrong/ mistake here ? Any help will be appreciable.

Thanks

Abhishek Mitra
  • 3,335
  • 4
  • 25
  • 46
  • check once your `backButton` apart from everything is fine, in your code works perfectly in my side – Anbu.Karthik Apr 13 '17 at 11:00
  • When i push to a viewcontroller, a default back button has been created, so i need to replace that by my own designed button, if I do it in that class, then it can be possible but I need at every possible pushed view controllers, so i have created the extension, but failed to get that. @Anbu.Karthik – Abhishek Mitra Apr 13 '17 at 11:03
  • i am not face the any issue its works perfectly – Anbu.Karthik Apr 13 '17 at 11:08
  • @Anbu.Karthik how it is working perfecly, :/ when I added "class" before the extension method and did : self.navigationItem.leftBarButtonItem = UIButton.backButtonTarget(self, action: #selector(self.popCurrentViewController)), Then its started working. By the way, Thanks for your quick responce. :) – Abhishek Mitra Apr 13 '17 at 11:14
  • 1
    @Anbu.Karthik It will not show back button because backButton is `nil` so it will not call method on optional nil object. – Nirav D Apr 13 '17 at 11:19

1 Answers1

2

There is no button in navigationBar is because your backButton is nil, Currently you have added extension with instance method instead of that you need class method.

extension UIButton {

    class func backButtonTarget(_ target: Any, action: Selector) -> UIBarButtonItem {
        let backButton = UIButton(frame: CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(12), height: CGFloat(20)))
        backButton.setBackgroundImage(UIImage(named: "back.png"), for: .normal)
        let barBackButtonItem = UIBarButtonItem(customView: backButton)
        backButton.addTarget(target, action: action, for: .touchUpInside)
        return barBackButtonItem
    }
}

Now add BarButtonItem this way.

self.navigationItem.leftBarButtonItem = UIButton.backButtonTarget(self, action: #selector(self.popCurrentViewController))
Nirav D
  • 71,513
  • 12
  • 161
  • 183