IOS UIBarButtonItem 工作正常,而 UIButton 导致 Unrecognized Selector Sent to Instance

Posted

技术标签:

【中文标题】IOS UIBarButtonItem 工作正常,而 UIButton 导致 Unrecognized Selector Sent to Instance【英文标题】:IOS UIBarButtonItem works fine while UIButton causes Unrecognized Selector Sent to Instance 【发布时间】:2012-09-26 16:34:09 【问题描述】:

我正在尝试实现一个自定义导航栏按钮项目,当用户单击以栏项目调用一个函数时,我有一个选择器。 如果我将 bar item 设置为 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];

这给了我:

-[UIButton view]: unrecognized selector sent to instance 0x9466620
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIButton view]: unrecognized selector sent to instance 0x9466620'

如果我设置

 self.navigationItem.rightBarButtonItem = btn2;

 self.navigationItem.rightBarButtonItem = btn3;

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

那么为什么它会给我错误以及如何使这个按钮成为自定义按钮?

编辑:

当我添加一个像

这样的 void 函数时
- (void)gearTapped
    [self setColorButtonTapped:self];

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

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

它通常应该像这样工作,但有一个自定义按钮

【问题讨论】:

它的工作 4 我也是 以这个 iphone 代码开始 ***.com/questions/11161909/… 【参考方案1】:

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

[self.colorPickerPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

如果您打算在您的操作中使用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];

然后你在哪里分配目标和行动:

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

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

希望这会有所帮助!

【讨论】:

对不起,我没有真正关注你。但我会修改我的答案,使其更加明确。 您能不能说得更具体一些或者给我一个例子?例如,当我编写一个 void 函数并在按钮 -(void)popUp [self setColorButtonTapped:self] 中调用它并在按钮 [backButton2 addTarget:self action:@selector(popUp) 处更改选择器时,这不会给我一个错误,但只会在单行和屏幕中间显示弹出窗口 @MordFustang 让我知道这是否能更清楚地说明问题。 它并没有完全解决问题,但至少它没有给出任何错误它像问题中的 oicture 一样工作,不过谢谢 @MordFustang 感谢您的接受。你有零高度弹出框的问题吗?您能否更新您的问题以指明您的 当前 代码究竟是什么,以便我可以看到发生了什么?【参考方案2】:
UIView* btnView = [[UIView alloc] initWithFrame: backButton2.bounds];
[btnView addSubview: backButton2];

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

//in case you are not using arc
[btnView release];

干杯...

【讨论】:

这也给了我错误-[UIButton view]: unrecognized selector sent to instance 0xa35ba50 尝试将按钮创建为自定义类型的按钮。 UIButton* backButton2 = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = frameimgback2;【参考方案3】:

您的错误可能是因为您不应使用 alloc/initWithFrame 初始化 UIButton,而是使用其设计的 buttonWithType: 初始化程序(然后单独设置其框架)。

【讨论】:

以上是关于IOS UIBarButtonItem 工作正常,而 UIButton 导致 Unrecognized Selector Sent to Instance的主要内容,如果未能解决你的问题,请参考以下文章

UIBarButtonItem 工作但在 Xcode 11 和 Xcode 12 中不可见

如何为栏按钮添加徽章?

UIBarButtonItem 没有更新

更改 UIBarButtonItem 的 UIToolbar 阴影颜色

UIView ExclusiveTouch:UIBarButtonItem 的奇怪行为

在 secondviewcontroller UIBarbuttonItem 对于 swrevealviewcontroller 不可见?