Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在运行时为UIBarButtonItem设置目标和操作_Ios_Objective C_Iphone_Swift_Uibarbuttonitem - Fatal编程技术网

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

Ios 如何在运行时为UIBarButtonItem设置目标和操作,ios,objective-c,iphone,swift,uibarbuttonitem,Ios,Objective C,Iphone,Swift,Uibarbuttonitem,已尝试此操作,但仅适用于UIButton: [btn setTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside]; 直接设置UIBarButtonItem的目标和操作属性。我遇到了类似的问题。。。我想你的意思是,如果你的UIButton不是你的UITabBar的一部分,那么它可以正常工作。如果这是您提出的问题,请检查您的btnClicked方法并将其更改为: -btnCli

已尝试此操作,但仅适用于UIButton:

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

直接设置UIBarButtonItem的
目标
操作
属性。

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

-btnClicked:(id)sender

然后在头文件中声明btnClicked

值得一提的是,我在TabbarButtonim中设置了一个按钮:

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

您可能需要尝试addTarget方法。

UIBarButtonItem没有相同的addTarget方法,因此您必须按如下方式直接设置它们

UIBarButtonItem *barListBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemAdd target:self action:@selector(getTruckStopListAction)];   
self.navigationItem.rightBarButtonItem = barListBtn;
[barListBtn release];
btn.target = self;
btn.action = @selector(barButtonCustomPressed:);


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

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)#>
UIBarButtonItem*customButton=[[UIBarButtonItem alloc]initWithImage:style:target:action:
UIBarButtonItem*customButton=[UIBarButtonItem alloc]initWithTitle:style:target:action:
UIBarButtonItem*customButton=[UIBarButtonItem alloc]initWithImage:LandscapeMagePhone:style:target:action:

如果您在代码中需要足够多的时间,可以继续扩展
uibarbuttoneim
,我在下面的Swift中已经完成了这项工作。:)

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

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

@wp42今天确实有用

在objective-C中,一种巧妙的方法是向UIBarButtonItem类添加一个类别:

.h文件

#import <UIKit/UIKit.h>

@interface UIBarButtonItem (addons)

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

@end
实际上:

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

设置
uibarbuttoneim的
目标
操作

Swift 5&4

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

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

Swift 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!")
}

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

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

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

此外,您还可以取出“:”making…:@selector(btnClicked:)];进入…:@selector(btnClicked)];注意:这仅在
UIBarButtonItem
不使用自定义视图时有效,如
UIButton
对于自定义视图,请使用:[按钮添加目标:自我操作:@selector(buttonPressed)forControlEvents:UIControlEventTouchUpInside];你能举个例子说明这些应该设置成什么吗?目标说它需要一个AnyObject?是否应该将其设置为UIGestureRecognitor?假设btn是UIBarButtonItem,[btn setTarget:self];[btn setAction:@selector(btnClicked:)]或点符号btn.target=self;btn.action=@selector(btnClicked:);两者都应该像@Ole Begemann所描述的那样工作。根据文档,这不适用于使用自定义视图初始化的实例。“此方法创建的条形按钮项不调用其目标的操作方法来响应用户交互。相反,条形按钮项希望指定的自定义视图处理任何用户交互并提供适当的响应。”请参阅以获取即使对UIButton也无效的引用。对于UIButton,正确的方法是
-addTarget:action:forControlEvents:
UIBarButtonItem没有addTarget方法。该方法不存在,请检查文档:您想的是UIButtonThank!!这正是我实现自定义UIBarButtonim类所需的内容伟大的答案,特别是如果您希望在设计时创建按钮!这仅在UIBarButtonItem不使用自定义视图时有效。
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!")
}
profileImageView.isUserInteractionEnabled = true
let tap = UITapGestureRecognizer(target: self, action: #selector(handleProfileImageTap))
profileImageView.addGestureRecognizer(tap)
navigationItem.leftBarButtonItem = UIBarButtonItem(customView: profileImageView)