IOS UIBarButtonItem工作正常,而UIButton导致无法识别的选择器发送到实例

Mor*_*ang 2 objective-c uibutton uibarbuttonitem ios unrecognized-selector

我正在尝试实现一个自定义导航栏按钮项,当用户点击一个函数被调用的条形项时,我有一个选择器.如果我将条形项设置为UIBarButtonItem它只是工作正常但我必须使用自定义图像为按钮没有边框和适当的大小.

所以在viewdidload我打电话

- (void)viewDidLoad 
{
    [super viewDidLoad];
    //gear button on navigation Bar
    UIImage* imageback2 = [UIImage imageNamed:@"ICON - Gear-BarstyleItem@2x.png"];
    CGRect frameimgback2 = CGRectMake(0, 0, 40, 40);

    UIButton *backButton2 = [[UIButton alloc] initWithFrame:frameimgback2];
    [backButton2 setBackgroundImage:imageback2 forState:UIControlStateNormal];
    [backButton2 addTarget:self
                    action:@selector(setColorButtonTapped:)
          forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem *btn2 = [[UIBarButtonItem alloc] initWithCustomView:backButton2];


    UIBarButtonItem *btn3 =[[UIBarButtonItem alloc] initWithImage:imageback2 style:UIBarButtonItemStylePlain target:self action:@selector(setColorButtonTapped:)];

    self.navigationItem.rightBarButtonItem = btn2;
}

#pragma mark Callbacks

- (IBAction)setColorButtonTapped:(id)sender{
    if (_colorPicker == nil) {
        self.colorPicker = [[ColorPickerController alloc] initWithStyle:UITableViewStylePlain];
        _colorPicker.delegate = self;
        self.colorPickerPopover = [[UIPopoverController alloc] initWithContentViewController:_colorPicker];
    }
    [self.colorPickerPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
Run Code Online (Sandbox Code Playgroud)

这给了我:

-[UIButton view]: unrecognized selector sent to instance 0x9466620
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIButton view]: unrecognized selector sent to instance 0x9466620'
Run Code Online (Sandbox Code Playgroud)

如果我订

 self.navigationItem.rightBarButtonItem = btn2;
Run Code Online (Sandbox Code Playgroud)

 self.navigationItem.rightBarButtonItem = btn3;
Run Code Online (Sandbox Code Playgroud)

它工作正常,但按钮有边框和背景颜色和较小的图像大小

那么为什么它会给我错误?如何将此按钮设为自定义按钮?

编辑:

当我添加一个像void这样的void函数时

- (void)gearTapped{
    [self setColorButtonTapped:self];
}
Run Code Online (Sandbox Code Playgroud)

并在按钮处更改选择器它不会给出任何错误,但它会在屏幕中间仅显示popUp一行

[backButton2 addTarget:self
                    action:@selector(gearTapped)
          forControlEvents:UIControlEventTouchUpInside];
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

它通常应该像这样工作,但使用自定义按钮 在此输入图像描述

Car*_*zey 6

您正在将UIButton实例作为sender参数传递给您的操作.然后sender作为参数传递给期望UIBarButtonItem实例的方法:

[self.colorPickerPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
Run Code Online (Sandbox Code Playgroud)

如果要sender在操作中使用参数,则应对两个不同类的对象单独执行操作.喜欢:

- (void)loadColorPicker
{
    if (_colorPicker == nil) {
        self.colorPicker = [[ColorPickerController alloc] initWithStyle:UITableViewStylePlain];
        _colorPicker.delegate = self;
        self.colorPickerPopover = [[UIPopoverController alloc] initWithContentViewController:_colorPicker];
    }
}
- (void)colorBarButtonItemTapped:(UIBarButtonItem *)sender
{
    [self loadColorPicker];
    [self.colorPickerPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

- (void)colorButtonTapped:(UIButton *)sender
{
    [self loadColorPicker];
    [self.colorPickerPopover presentPopoverFromRect:sender.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
Run Code Online (Sandbox Code Playgroud)

然后分配目标和操作的位置:

[backButton2 addTarget:self
                action:@selector(colorButtonTapped:)
      forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem *btn3 =[[UIBarButtonItem alloc] initWithImage:imageback2 style:UIBarButtonItemStylePlain target:self action:@selector(colorBarButtonItemTapped:)];
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!