IOS - Swift - adding target and action to BarButtonItem's customView

18,782

Solution 1

You can try to instead of linking the rightItemAction and adding a UIView to the customView, add a UIButton to the rightBarButtonItem:

    var button: UIButton = UIButton()
    button.setImage(UIImage(named: "cameraIconInactive"), forState: .Normal)
    button.frame = CGRectMake(0, 0, 45, 45)
    button.targetForAction("pushProfileToCamera", withSender: nil)

    var rightItem:UIBarButtonItem = UIBarButtonItem()
    rightItem.customView = button
    self.navigationItem.rightBarButtonItem = rightItem

Solution 2

Try like this

var rightItem:UIBarButtonItem = UIBarButtonItem(image: rightImage, landscapeImagePhone: rightImage, style: UIBarButtonItemStyle.Plain, target: self, action: "pushProfileToCamera")

Solution 3

self.navigationController?.navigationBarHidden =  false

    let navigationBar = UINavigationBar(frame: CGRectMake(0, 0, self.view.frame.size.width, 64)) // Offset by 20 pixels vertically to take the status bar into account

    navigationBar.backgroundColor = UIColor.blueColor()
    navigationBar.delegate = self;

    // Create a navigation item with a title
    let navigationItem = UINavigationItem()

    //menu button
    let menubutton: UIButton = UIButton(frame: CGRectMake(0, 0, 30, 30))
    menubutton.setImage(UIImage(named: "menu"), forState: UIControlState.Normal)
    menubutton.addTarget(self, action: "btn_clicked", forControlEvents: UIControlEvents.TouchUpInside)

    //menu button custom view
    let leftView = UIView(frame: CGRectMake(0,0,30,30))
    leftView.addSubview(menubutton)

    //left uibarbutton
    let leftItem:UIBarButtonItem = UIBarButtonItem(customView: leftView)
    navigationItem.leftBarButtonItem = leftItem


    //searchButton
    let searchbutton: UIButton = UIButton()
    searchbutton.setImage(UIImage(named: "search1x"), forState: UIControlState.Normal)
    searchbutton.frame = CGRectMake(0, 0, 30, 30)
    searchbutton.addTarget(self, action: "btn_clicked", forControlEvents: UIControlEvents.TouchUpInside)


    //menu button custom view
    let rightView = UIView(frame: CGRectMake(0,0,30,30))
    rightView.addSubview(searchbutton)

    //right uibarbutton
    let rightItem:UIBarButtonItem = UIBarButtonItem(customView: rightView)
    navigationItem.rightBarButtonItem = rightItem

    // Assign the navigation item to the navigation bar
    navigationBar.items = [navigationItem]

    // Make the navigation bar a subview of the current view controller
    self.view.addSubview(navigationBar)
Share:
18,782
bkopp
Author by

bkopp

mobile tinkerer, web and apps

Updated on June 04, 2022

Comments

  • bkopp
    bkopp almost 2 years

    I'm creating a custom view, with a uiimageview as a subview. I'm then using that custom view in my navigation bar as the rightBarButtonItem. This works to display the proper icon in the proper location, but for whatever reason the function I define in "action" is never being called, so the segue isn't performed when I tap on the rightBarButtonItem. Oddly enough if I do NOT insert a custom view, but instead comment that bit out and just set a title, target, and action for rightItem then the function is performed properly. somehow adding that custom view messes with the target and action properties, but I can't seem to figure out how to fix it. Any help would be greatly appreciated!

    //create custom view for right item and set it
        var imageViewRight:UIImageView = UIImageView()
        imageViewRight.frame = CGRectMake(5, 10, 35, 25)
        let rightImage:UIImage = UIImage(named: "cameraIconInactive")!
        imageViewRight.image = rightImage
        var rightView:UIView = UIView()
        rightView.frame = CGRectMake(0, 0, 45, 45)
        rightView.addSubview(imageViewRight)
        var rightItem:UIBarButtonItem = UIBarButtonItem()
       //this line right below is the problem - if I comment it out and replace with a simple rightItem.title = "test" and leave everything else the same, then the method runs properly
        rightItem.customView = rightView
        rightItem.target = self
        rightItem.action = "pushProfileToCamera"
        self.navigationItem.rightBarButtonItem = rightItem
    
    }
    
    func pushProfileToCamera(){
        println("pushing profile to camera")
        self.performSegueWithIdentifier("pushProfileToCamera", sender: nil)
    }
    

    EDIT:

    actually sat on this for 24 hours and came up with this solution before I saw these answer suggestions.. any reason I shouldn't do this? It works..

    //create the custom rightBarButtonItem
        //create the imageView with icon
        var imageViewRight:UIImageView = UIImageView()
        imageViewRight.frame = CGRectMake(5, 10, 35, 25)
        var rightImage:UIImage = UIImage(named: "cameraIconInactive")!
        imageViewRight.image = rightImage
        //put the imageView inside a uiview
        var rightView:UIView = UIView()
        rightView.frame = CGRectMake(0, 0, 45, 45)
        rightView.addSubview(imageViewRight)
        //create the tap gesture recognizer for that uiview
        var rightGestureRecognizer:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "pushProfileToCamera")
        rightView.addGestureRecognizer(rightGestureRecognizer)
        //create the uibarbuttonitem, assign our custom view to it, and insert it in the nav bar!
        var rightItem:UIBarButtonItem = UIBarButtonItem()
        rightItem.customView = rightView
        self.navigationItem.rightBarButtonItem = rightItem