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 的 UIToolbar 阴影颜色
UIView ExclusiveTouch:UIBarButtonItem 的奇怪行为
在 secondviewcontroller UIBarbuttonItem 对于 swrevealviewcontroller 不可见?