替换或扩展 UIBarButtonItem 选择器
Posted
技术标签:
【中文标题】替换或扩展 UIBarButtonItem 选择器【英文标题】:Replace or extend UIBarButtonItem selector 【发布时间】:2012-04-12 08:48:04 【问题描述】:我正在尝试制作一个自定义 UIToolbar
来处理旋转和自定义排列。当它处于纵向模式时,一些 barbuttonitem 将不可见,因此我添加了一个“更多”按钮,从中弹出一个带有这些项目的小视图。我的问题是,当我当前的方向是纵向并且当我选择一个可见的 barbuttonitem (不在 popup 中)时,如果它打开,我想关闭它。我希望弹出视图中 uibarbuttons 的 smae 行为在点击后关闭弹出窗口。
所以我试图用我自己的方式替换 UIBarButtonItem 的选择器,我在其中调用已经定义的操作,如下所示:
-(SEL)extendOriginal:(UIBarButtonItem *) uibb
if (popup) popup.hidden = YES;
[uibb.target performSelector:uibb.action];
// return ?? do what ??
但是如何替换原来的选择器以我的自定义 UIToolbar 作为它的目标来调用这个自定义方法?或者我怎么能用这个调用“扩展”原始选择器?对不起,如果问题很蹩脚:)
编辑:换句话说,我希望在点击 UIBarButtonItem 时执行 2 个具有 2 个单独目标的操作。
谢谢!
【问题讨论】:
【参考方案1】:这个-(SEL)extendOriginal:(UIBarButtonItem *) uibb
没有任何意义。
我假设您正在某处设置目标和栏按钮项的操作。在那里,您可以设置任何方法,其中一个参数 id
或 UIBarButtonItem*
作为选择器。
因此尝试将您的代码更改为
- (void)myMethod:(UIBarButtonItem *) uibb
if (popup) popup.hidden = YES;
// do cool stuff here
并将目标设置为
[[UIBarButtonItem alloc] initWithTitle: @"Blabla" style: UIBarButtonItemStylePlain target: self action: @selector(myMethod:)];
【讨论】:
是的,我知道这没有意义 :) 我将 UIBarButtonItems 添加到具有我的自定义工具栏之一的视图控制器中。我的问题是我想透明地实现它,因此定义按钮操作的其他视图控制器应该没有此实现细节的代码(顺便说一句,目前它有,但这就是为什么我需要一个自定义工具栏来自动处理这个问题。 编辑了我的问题,更准确地说。【参考方案2】:最后,我找到了一种方法,虽然不是最漂亮的,但它确实有效。
在自定义工具栏类中,我在其布局方法中创建了一个UITapGestureRecognizer
来处理点击。我已将 cancelsTouchesInView
设置为 false 并在
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
方法我只为工具栏的子视图返回 true。
这样每个UIBarButtonItem
的原始目标和动作保持不变,处理我的弹出窗口的补充代码是UIGestureRecognizer
的动作。
另一个问题是区分工具栏上的点击项目(touch.view
中的点击视图是一些未记录的视图,是的),最终我用一些 BOOL iVar 做到了。
我希望这能帮助遇到同样问题的人。
【讨论】:
以上是关于替换或扩展 UIBarButtonItem 选择器的主要内容,如果未能解决你的问题,请参考以下文章
[UIBarButtonItem _isAncestorOfFirstResponder]:发送到实例的无法识别的选择器
无法识别的选择器发送到实例(使用 UIBarButtonItem)
以编程方式创建的 UIBarButtonItem 未启动选择器操作