Ios 用touchesBegind动作对UIBarButtonItem进行子类化
我正在尝试创建一个子类Ios 用touchesBegind动作对UIBarButtonItem进行子类化,ios,iphone,cocoa-touch,swift,uibarbuttonitem,Ios,Iphone,Cocoa Touch,Swift,Uibarbuttonitem,我正在尝试创建一个子类uibarbuttoneim,我可以在故事板/xib中使用它,在那里可以听到触摸开始的动作(在触摸按钮时播放按钮声音)。以下是我得到的: class UIAudibleBarButtonItem : UIBarButtonItem { override init() { super.init() target = self action = "touchesBegan:" } required
uibarbuttoneim
,我可以在故事板/xib中使用它,在那里可以听到触摸开始的动作(在触摸按钮时播放按钮声音)。以下是我得到的:
class UIAudibleBarButtonItem : UIBarButtonItem {
override init() {
super.init()
target = self
action = "touchesBegan:"
}
required init(coder aDecoder:NSCoder) {
super.init(coder: aDecoder)
}
func touchesBegan(touches:NSSet, withEvent event:UIEvent) {
AudioManager.instance.playButtonSound()
}
}
但是它不起作用,即不调用touchsbegind。我需要做什么改变才能让这一切顺利进行
更新:
class UIAudibleBarButtonItem : UIBarButtonItem {
override init() {
super.init();
setup();
}
override init(barButtonSystemItem systemItem: UIBarButtonSystemItem, target: AnyObject?, action: Selector) {
super.init(barButtonSystemItem: systemItem, target: target, action: action);
setup();
}
override init(image: UIImage?, landscapeImagePhone: UIImage?, style: UIBarButtonItemStyle, target: AnyObject?, action: Selector) {
super.init(image: image, landscapeImagePhone: landscapeImagePhone, style: style, target: target, action: action);
setup();
}
override init(image: UIImage?, style: UIBarButtonItemStyle, target: AnyObject?, action: Selector) {
super.init(image: image, style: style, target: target, action: action);
setup();
}
override init(title: String?, style: UIBarButtonItemStyle, target: AnyObject?, action: Selector) {
super.init(title: title, style: style, target: target, action: action);
setup();
}
override init(customView:UIView) {
super.init(customView: customView);
setup();
}
required init(coder aDecoder:NSCoder) {
super.init(coder: aDecoder);
setup();
}
private func setup()
{
target = self;
action = "buttonPressed:";
println("setup()");
}
func buttonPressed(sender:AnyObject)
{
AudioManager.instance.playButtonSound();
println("buttonPressed()");
}
}
UIBarButtonItem
不是一个UIView
如果您想实现类似的效果,请创建一个按钮,听触摸该按钮(使用addTarget:…
或touchesbeated
),然后使用initWithCustomView
从该按钮创建条形按钮项
编辑:
根据声音的确切播放时间,还有一种可能性。如果要在按下并释放后播放声音,只需将上述代码修改为:
action=“按钮按下:”
...
按下func按钮(发件人:AnyObject)
如果您使用swift,这里有一种检测以下操作的简单方法。你所要做的就是在你的故事板上连接这个类,点击你的工具栏按钮,你会看到动作火
以后谢谢我
class MVBarbuttonItem: UIBarButtonItem {
override func awakeFromNib() {
self.action = #selector(MVBarbuttonItem.didTapButton)
}
@objc func didTapButton() {
}
}
我假设您在故事板中将
uiaudiblebarbuttonim
作为自定义类提供,而不是将这一行放在类@objc(uiaudiblebarbuttonim)
的正上方,然后看看它是否有效
这就是我的工作 点击并检查哪个视图正在处理触摸。但这只在程序上起作用?不适用于故事板/Xib文件,对吗?@Avalon请参阅我的编辑。如果你需要在用户触摸按钮时立即播放声音,你需要用很难的方法。谢谢你的编辑,但它不起作用。buttonPressed()不会被调用。除了处理程序名称不同之外,这与我上面的代码有什么不同?编辑:实际上初始化器根本不会被调用。但是编码初始化被调用了!但是,即使在将这两行代码放入coderinit之后,它也不起作用。它没有太大的区别,它只有正确数量的参数。是否执行
action=“buttonPressed:”
行?编辑:然后将这两个目标行和操作行也放在另一个init中(或者创建一个commonInit
函数,并从两个init调用它)好的,我覆盖了所有的初始化器,只是为了确保在测试它时会明确调用commonInit方法。但按下的按钮永远不会被调用。请参见上面我的更新代码。