替换或扩展 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 没有任何意义。

我假设您正在某处设置目标和栏按钮项的操作。在那里,您可以设置任何方法,其中一个参数 idUIBarButtonItem* 作为选择器。

因此尝试将您的代码更改为

- (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 在显示两次后未触发选择器

[UIBarButtonItem _isAncestorOfFirstResponder]:发送到实例的无法识别的选择器

无法识别的选择器发送到实例(使用 UIBarButtonItem)

以编程方式创建的 UIBarButtonItem 未启动选择器操作

iPhone:我可以将类方法用于 UIBarButtonItem 的操作选择器吗?

以编程方式添加到导航栏的UIBarButtonItem无法调用选择器,而添加到工具栏的按钮确实如此