问题
我的iPad应用程序在长按按钮后,无法将弹出窗口附加到按钮栏项上。但这似乎是撤消/重做的标准操作方式。其他应用程序如何实现呢?
背景
在我的UIKit(iPad)应用程序工具栏中有一个“撤消”按钮(UIBarButtonSystemItemUndo)。当我按下撤消按钮时,它会触发其操作,即undo:,并且正确执行。
然而,在iPad上,撤消/重做的“标准UE约定”是按下撤消执行撤消操作,但是如果“按住不放”该按钮,则会显示弹出控制器,用户可以选择“undo”或“redo”,直到控制器被关闭。
附加弹出控制器的正常方式是使用presentPopoverFromBarButtonItem:方法,我可以轻松配置此项。为了使其仅在长按后显示,我们必须设置视图以响应“长按”手势事件,如以下代码片段:
UILongPressGestureRecognizer *longPressOnUndoGesture = [[UILongPressGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleLongPressOnUndoGesture:)];
//Broken because there is no customView in a UIBarButtonSystemItemUndo item
[self.undoButtonItem.customView addGestureRecognizer:longPressOnUndoGesture];
[longPressOnUndoGesture release];
通过这种方式,在视图上按住并保持,方法handleLongPressOnUndoGesture:将被调用,在该方法内我将配置并显示撤销/重做的弹出窗口。 到目前为止,一切都很好。问题在于没有视图可供附加。self.undoButtonItem是一个UIButtonBarItem,而不是视图。
可能的解决方案:
1) [理想情况] 将手势识别器附加到按钮栏项上。可以将手势识别器附加到视图,但UIButtonBarItem不是视图。它确实有一个.customView属性,但是当buttonbaritem是标准系统类型(在本例中是)时,该属性为nil。
2) 使用另一个视图。我可以使用UIToolbar,但是那需要进行一些奇怪的命中测试,并且是所有的黑客,即使首先可能也无法实现。我想不到其他可用的替代视图。
3) 使用customView属性。像UIBarButtonSystemItemUndo这样的标准类型没有customView(为nil)。设置customView将删除它需要具有的标准内容。这将相当于重新实现UIBarButtonSystemItemUndo的所有外观和功能,即使可以做到也是如此。
问题:如何将手势识别器附加到此“按钮”上?更具体地说,在iPad应用程序中如何实现标准的按住并保持以显示重做弹出窗口?
想法?非常感谢,特别是如果有人实际上在他们的应用程序中使用了这个(我在想你,omni),并且愿意分享...
if ([[sortmodeBarButtonItem valueForKey:@"view"] respondsToSelector:@selector(addGestureRecognizer:)])
中,可以使其更加稳健。 - William Denniss[barButtonItem valueForKey:@"view"]
将返回nil。唯一的解决方案似乎是实现一个自定义视图。请参见laxman khanal的答案。 - EckhardN