如何在运行时为 UIBarButtonItem 设置目标和操作

Posted

技术标签:

【中文标题】如何在运行时为 UIBarButtonItem 设置目标和操作【英文标题】:How to set target and action for UIBarButtonItem at runtime 【发布时间】:2011-01-20 23:26:02 【问题描述】:

试过了,但只适用于 UIButton:

[btn setTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];

【问题讨论】:

这似乎对 UIButton 无效。 对于UIButton,正确的方法是-addTarget:action:forControlEvents: 【参考方案1】:

只需直接设置 UIBarButtonItem 的 targetaction 属性即可。

【讨论】:

注:这仅适用于 UIBarButtonItem 不使用自定义视图,例如 UIButton 对于自定义视图,使用:[button addTarget:self action:@selector(buttonPressed) forControlEvents:UIControlEventTouchUpInside]; 你能举个例子说明应该设置什么吗?目标说它需要一个 AnyObject?应该将其设置为 UIGestureRecognizer 吗? 假设 btn 是 UIBarButtonItem,[btn setTarget:self]; [btn setAction:@selector(btnClicked:)] 或点表示法 btn.target = self; btn.action = @selector(btnClicked:);两者都应该像@Ole-Begemann 所描述的那样工作。 根据文档,这不适用于已使用自定义视图初始化的实例。 “此方法创建的条形按钮项不会调用其目标的操作方法来响应用户交互。相反,条形按钮项期望指定的自定义视图来处理任何用户交互并提供适当的响应。”请参阅apple.co/2egXdmR 以供参考【参考方案2】:

UIBarButtonItem 没有相同的 addTarget 方法,所以你必须直接设置它们如下

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

【讨论】:

谢谢!!这正是我实现自定义 UIBarButtonItem 类所需要的 很好的答案,特别是如果您想在设计时创建按钮!【参考方案3】:

设置targetactionUIBarButtonItem

Swift 5 和 4

button.target = self
button.action = #selector(action)

@objc func action (sender:UIButton) 
    print("action")

【讨论】:

这仅在 UIBarButtonItem 不使用自定义视图时有效。【参考方案4】:

我遇到了类似的问题...我假设您的意思是,如果您的 UIButton 不是您的 UITabBar 的一部分来调用 btnClicked 那么它可以正常工作。如果这是您提出的问题,请检查您的 btnClicked 方法并将其更改为:

-btnClicked:(id)sender

-(void) btnClicked:(id)sender

那个,并在头文件中声明 btnClicked...

对于它的价值,这就是我在 tabbarbuttonitem 中设置按钮的方式:

UIBarButtonItem *exampleButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"button.png"] style:UIBarButtonItemStylePlain target:self action:@selector(btnClicked:)];

【讨论】:

另外,您可以取出“:”制作 ...:@selector(btnClicked:)];进入 ...:@selector(btnClicked)];【参考方案5】:

如果您在代码中需要足够多的时间,最好继续扩展UIBarButtonItem,我在下面用 Swift 完成了这一点。 :)

import UIKit

extension UIBarButtonItem 
    func addTargetForAction(target: AnyObject, action: Selector) 
        self.target = target
        self.action = action
    

例如,将 self 作为 UIViewController,您只需调用:

self.myBarButtonItem.addTargetForAction(self, action: #selector(buttonPressed(_:))

【讨论】:

【参考方案6】:
UIBarButtonItem *barListBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemAdd target:self action:@selector(getTruckStopListAction)];   
self.navigationItem.rightBarButtonItem = barListBtn;
[barListBtn release];

【讨论】:

【参考方案7】:

@wp42 今天确实有效。

在 Objective-C 中这样做的一个好方法是向 UIBarButtonItem 类添加一个类别:

.h 文件

#import <UIKit/UIKit.h>

@interface UIBarButtonItem (addons)

-(void)addTarget:(id)target andAction:(SEL)action;

@end

.m 文件

#import "UIBarButtonItem+addons.h"

@implementation UIBarButtonItem (addons)

-(void)addTarget:(id)target andAction:(SEL)action
   [self setTarget:target];
   [self setAction:action];


@end

在实践中:

[myBtn addTarget:self andAction:@selector(myFunction:)];

【讨论】:

【参考方案8】:

对于自定义视图:使用UITapGestureRecognizer 并将isUserInteractionEnabled 设置为true

profileImageView.isUserInteractionEnabled = true
let tap = UITapGestureRecognizer(target: self, action: #selector(handleProfileImageTap))
profileImageView.addGestureRecognizer(tap)
navigationItem.leftBarButtonItem = UIBarButtonItem(customView: profileImageView)

【讨论】:

【参考方案9】:

如果您以编程方式添加 UIBarButtonItem,设置目标和操作的最佳方法是使用以下方法之一初始化按钮:

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

【讨论】:

【参考方案10】:

斯威夫特 5:

提取到扩展:

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)
    


代码调用:

navigationItem.rightBarButtonItem = .nextBtn(target: self, action: #selector(rightBarButtonAction))

行动:

@objc func rightBarButtonAction() 
    Swift.print("Button tapped!")

向这个工厂添加新按钮非常容易。

【讨论】:

【参考方案11】:

您可能想尝试 addTarget 方法。

【讨论】:

UIBarButtonItem 没有 addTarget 方法。 该方法不存在,请查看文档:developer.apple.com/library/ios/documentation/UIKit/Reference/… 你想到的是 UIButton

以上是关于如何在运行时为 UIBarButtonItem 设置目标和操作的主要内容,如果未能解决你的问题,请参考以下文章

x86 汇编 (AT&T):如何在运行时为变量动态分配内存?

如何在 Eclipse 运行时为 GAE 模块使用共享库?

如何在运行时为结构数组赋值?

带有图像和文本的 UIBarButtonItem

如何在类中注入代码并在运行时为类字段赋值?

如何在运行时为使用 sbt-native-packager 捆绑的应用程序加载配置文件