2014-09-05 50 views
0

我试图创建一个UIBarButtonItem的子类,我可以在故事板/ Xib中使用touchesBegan可以侦听动作(在触摸按钮时播放按钮声音)。这是我得到的:用touchesBegan动作继承UIBarButtonItem

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() 
    } 
} 

然而它不起作用,即touchesBegan没有被调用。我需要改变以做出这项工作?

UPDATE:

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()"); 
    } 
} 
+0

Hitest并检查哪个视图正在处理触摸。 – Woodstock 2014-09-05 06:23:50

回答

-1

UIBarButtonItem不是UIView

如果您想达到这样的效果,请创建一个按钮,听按一下该按钮(使用addTarget:...touchesBegan),然后使用initWithCustomView从该按钮创建条形按钮项目。

编辑:

根据何时应该播放声音,还有另一种可能性。如果你想后按播放声音和释放,只是修改上面的代码变成这样:

action = "buttonPressed:" ... func buttonPressed(sender:AnyObject)

+0

但这只能以编程方式工作?不适用于Storyboards/Xib文件,对吗? – BadmintonCat 2014-09-05 06:28:22

+0

@Avalon看到我的编辑。如果您需要在用户触摸按钮时立即播放声音,则需要采取艰难的行动。 – Templar 2014-09-05 06:39:49

+0

感谢您的编辑,但它不起作用。 buttonPressed()不会被调用。无论如何,这与我的代码有什么不同,除了处理程序名称不同之外呢? 编辑:实际上,初始化程序根本不会被调用。但编码器初始化被调用!但即使将这两行放入编码器初始化中,它也不起作用。 – BadmintonCat 2014-09-05 06:44:01

0

如果您使用SWIFT这里的下面检测动作的简单方法。所有你需要做的就是在你的故事板上连接这个类,点击你的栏按钮项目,你会看到动作火。

谢谢我以后!

class MVBarbuttonItem: UIBarButtonItem { 

    override func awakeFromNib() { 
     self.action = #selector(MVBarbuttonItem.didTapButton) 
    } 

    @objc func didTapButton() { 

    } 

}