你能用一个方法调用使一个类的所有对象做同样的事吗?

时间:2016-08-18 12:43:19

标签: swift animation inheritance uibutton jquery-animate

对不起,这可能看起来像个愚蠢的问题。如果我有一个继承自UIButton的类LargeButton,我有办法说当点击任何LargeButton时,所有LargeButton对象都会动画并消失吗?

    UIView.animateWithDuration(0.4, delay: 0, options: UIViewAnimationOptions.CurveEaseOut, animations: {
        AllLargeButtons.alpha = 0 
        }, completion: { finished in
            AllLargeButtons.hidden = true

有没有办法做这样的事情而不先将所有LargeButton存储在数组中?

编辑:

class LargeButton: UIButton {
    required init?(coder: NSCoder) {
        super.init(coder: coder)

        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(oneLargeButtonTapped), name: "oneOfLargeButtonsTapped", object: nil)
    }

    func oneLargeButtonTapped() {
        UIView.animateWithDuration(0.4, delay: 0, options: UIViewAnimationOptions.CurveEaseOut, animations: {
        self.alpha = 0 // Here you will get the animation you want
        }, completion: { finished in
            self.hidden = true // Here you hide it when animation done
        })
    }

    deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self)
    }
}


class viewController: UIViewController {
    @IBAction func buttonTapped(sender: UIButton) {
             NSNotificationCenter.defaultCenter().postNotificationName("oneOfLargeButtonsTapped", object: nil, userInfo: nil)
    }
}

创建LargeButton:

    lazy var aButton: LargeButton = {
        let button = LargeButton()
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(oneLargeButtonTapped), name: "oneOfLargeButtonsTapped", object: nil)

//        button.addTarget(self, action: #selector(oneLargeButtonTapped), forControlEvents: .TouchUpInside)

        return button
    }()

2 个答案:

答案 0 :(得分:4)

创建LargeButton对象时,将其注册为接收通知:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(LargeButton.oneLargeButtonTapped), name: "oneOfLargeButtonsTapped", object: nil)

在通知后点击其中一个LargeButtons。

NSNotificationCenter.defaultCenter().postNotificationName("oneOfLargeButtonsTapped", object: nil, userInfo: nil)

在方法“oneLargeButtonTapped”中实现所需的行为。

不要忘记在销毁之前取消注册通知中心的按钮。

NSNotificationCenter.defaultCenter().removeObserver(self) 

答案 1 :(得分:2)

不是你建议的方式,不是。这将要求每个班级跟踪他们不会做的所有现有对象。您可以通过让初始值设定项向MyView.as_view()(request, 'arg1', 'arg2', id='34') static添加新实例来实现此目的,但您不应该这样做。如果您希望拥有相同级别的对象,而其他对象没有动画,会发生什么?

相反,您应该创建一个包含您想要设置动画的所有对象的数组。让Array' LargeButton调用一个迭代对象数组的方法,并为它们设置动画。