Tried this but only works for UIButton:
[btn setTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
Tried this but only works for UIButton:
[btn setTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
Just set the UIBarButtonItem's target
and action
properties directly.
UIBarButtonItem
doesn't use a custom view, like a UIButton
–
Quinones UIBarButtonItem doesnt have the same addTarget method so you have to set them directly as follows
btn.target = self;
btn.action = @selector(barButtonCustomPressed:);
...
// can specify UIBarButtonItem instead of id for this case
-(IBAction)barButtonCustomPressed:(UIBarButtonItem*)btn
{
NSLog(@"button tapped %@", btn.title);
}
Set target
and action
of your UIBarButtonItem
Swift 5 & 4
button.target = self
button.action = #selector(action)
@objc func action (sender:UIButton) {
print("action")
}
I ran into a similar problem... I assume you mean that if your UIButton is not part of your UITabBar to call btnClicked then it works appropriately. If this is the problem you are proposing then, check your btnClicked method and change it from:
-btnClicked:(id)sender
to
-(void) btnClicked:(id)sender
that, and declare btnClicked in the header file...
For what it's worth, this is how I setup a button in tabbarbuttonitem:
UIBarButtonItem *exampleButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"button.png"] style:UIBarButtonItemStylePlain target:self action:@selector(btnClicked:)];
If you need this enough times in your code, it's nice to go ahead and extend UIBarButtonItem
which I've done below in Swift. :)
import UIKit
extension UIBarButtonItem {
func addTargetForAction(target: AnyObject, action: Selector) {
self.target = target
self.action = action
}
}
As an example, with self as a UIViewController
, you'd simply call:
self.myBarButtonItem.addTargetForAction(self, action: #selector(buttonPressed(_:))
UIBarButtonItem *barListBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemAdd target:self action:@selector(getTruckStopListAction)];
self.navigationItem.rightBarButtonItem = barListBtn;
[barListBtn release];
For a custom UIBarButtonItem
this works.
let button = UIButton(type: .custom)
button.setImage(image, for: .normal)
button.addTarget(self, action: #selector(yourFunction), for: .touchUpInside)
let barButtonItem = UIBarButtonItem(customView: button)
You set the target and action to the button that you are adding to your UIBarButtonItem
.
@wp42 It does work today.
A nifty way of doing this in objective-C is adding a category to UIBarButtonItem class:
.h file
#import <UIKit/UIKit.h>
@interface UIBarButtonItem (addons)
-(void)addTarget:(id)target andAction:(SEL)action;
@end
.m file
#import "UIBarButtonItem+addons.h"
@implementation UIBarButtonItem (addons)
-(void)addTarget:(id)target andAction:(SEL)action{
[self setTarget:target];
[self setAction:action];
}
@end
In practice:
[myBtn addTarget:self andAction:@selector(myFunction:)];
For custom views: use an UITapGestureRecognizer
and set up isUserInteractionEnabled
to true
.
profileImageView.isUserInteractionEnabled = true
let tap = UITapGestureRecognizer(target: self, action: #selector(handleProfileImageTap))
profileImageView.addGestureRecognizer(tap)
navigationItem.leftBarButtonItem = UIBarButtonItem(customView: profileImageView)
If you are programmatically adding the UIBarButtonItem, the best way to set the target and action is to initialize the button with one of the following methods:
UIBarButtonItem *customButton = [[UIBarButtonItem alloc] initWithImage:<#(UIImage)#> style:<#(UIBarButtonItemStyle)#> target:<#(id)#> action:<#(SEL)#>
UIBarButtonItem *customButton = [UIBarButtonItem alloc] initWithTitle:<#(NSString *)#> style:<#(UIBarButtonItemStyle)#> target:<#(id)#> action:<#(SEL)#>
UIBarButtonItem *customButton = [UIBarButtonItem alloc] initWithImage:<#(UIImage *)#> landscapeImagePhone:<#(UIImage *)#> style:<#(UIBarButtonItemStyle)#> target:<#(id)#> action:<#(SEL)#>
Swift 5:
Extract to extensions:
extension UIBarButtonItem {
static func nextBtn(target: AnyObject, action: Selector) -> UIBarButtonItem {
let title = "Next"
return button(title: title, target: target, action: action)
}
private static func button(title: String, target: AnyObject, action: Selector) -> UIBarButtonItem {
return UIBarButtonItem(title: title, style: .done, target: target, action: action)
}
}
Call in code:
navigationItem.rightBarButtonItem = .nextBtn(target: self, action: #selector(rightBarButtonAction))
Action:
@objc func rightBarButtonAction() {
Swift.print("Button tapped!")
}
Pretty easy to add new buttons to this factory.
You may want to try out the addTarget method.
© 2022 - 2024 — McMap. All rights reserved.
-addTarget:action:forControlEvents:
– Lanellelanette