【问题标题】:Call button clicked method in parent class in swift快速调用父类中的按钮单击方法
【发布时间】:2014-08-09 16:15:43
【问题描述】:

我有一个 ViewController,它调用一个类来构建一个菜单。此菜单使用 buttonClicked 方法绘制一个按钮。我从许多不同的 ViewController 调用此菜单,因此我需要此菜单根据调用它的 ViewController 调用不同的按钮方法。我想不出这个怎么编程?

class MenuController : UIViewController
{
    override func viewDidLoad() 
    {
        super.viewDidLoad()
         var menu = Menu()
         self.view.addSubview(menu)
    }

    func buttonClicked(sender:UIButton)
    {
        var tag = sender.tag
        println("I want the button click method to call this method")
    }
}

class Menu:UIView
{
    init()
    {
        var button:UIButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
        button.frame = CGRectMake(0,0,280, 25)
        button.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
        button.tag = Int(itemNo)
        menu.addSubview(button)
    }

    func buttonClicked(sender:UIButton)
    {
        var tag = sender.tag
        println(tag)
    }

}

【问题讨论】:

    标签: class button swift


    【解决方案1】:

    这是闭包或委托/协议的完美用例:

    关闭选项

    在你的 Menu 类中,创建一个公共变量(比如buttonCode)来承载你的闭包:

    class Menu:UIView
    {
      var buttonCode : ()->()
    

    您的buttonClicked 函数变为:

    func buttonClicked(sender:UIButton) {
      self.buttonCode()
    }
    

    然后在控制器中,你设置menu.buttonCode = { println("hello") },就是这样。

    协议选项

    您为您的菜单创建了一个协议,该协议需要一个buttonCode() 函数。您还可以在 Menu 类中创建一个 var 来承载委托的弱引用。你的视图控制器实现了协议和buttonCode() 函数。那么你的buttonClicked 函数就变成了:

    func buttonClicked(sender:UIButton) {
      self.delegate.buttonCode()
    }
    

    我个人现在更喜欢使用闭包选项,它更简洁,至少在这种情况下是这样。请参阅http://www.reddit.com/r/swift/comments/2ces1q/closures_vs_delegates/ 进行更深入的讨论。

    【讨论】:

    • 太棒了!这正是我所需要的,它完美地解决了我的问题。晚上想到的想法是继承 Menu() 然后重写 buttonClicked 方法,但是你的方法很好用。顺便说一句,这是一个很好回答的问题;感谢您抽出宝贵时间为我解答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 2015-10-31
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多